从java.util.Date中减去小时数

时间:2015-04-15 17:43:32

标签: java date

如何在下面的示例中减去一小时? (日期不是日历):

Date date1 = ...
Date date2 = ...
Date dateResult = ...

dateResult = date1 - date2; //(15:00 - 13:30 = 1:30)

...

1 个答案:

答案 0 :(得分:0)

这是一个有效的解决方案(限制在代码下面描述)

// uses a deprecated constructor, so don't do that in production code
// better and more save to use a Calendar instead
Date date1 = new Date(115, 0, 1, 15, 0);
Date date2 = new Date(115, 0, 1, 13, 30);

int millisPerDay = (int) TimeUnit.DAYS.toMillis(1);
int millisPerHour = (int) TimeUnit.HOURS.toMillis(1);
int millisPerMinute = (int) TimeUnit.MINUTES.toMillis(1);
int millisPerSecond = (int) TimeUnit.SECONDS.toMillis(1);

long millisDate1 = date1.getTime();
long millisDate2 = date2.getTime();

long millisDifference = millisDate1 - millisDate2;

int durationDays = (int) millisDifference / millisPerDay;
long remainder = millisDifference - durationDays * millisPerDay;

int durationHours = (int) remainder / millisPerHour;
remainder = remainder - durationHours * millisPerHour;

int durationMinutes = (int) remainder / millisPerMinute;
remainder = remainder - durationMinutes * millisPerMinute;

int durationSeconds = (int) remainder / millisPerSecond;

System.out.printf("%02d:%02d:%02d.%03d%n",
        durationDays,
        durationHours,
        durationMinutes,
        durationSeconds
);

有哪些限制:
- 首先,这段代码没有经过测试(除了你给出的例子)
- 该示例使用Date的弃用构造函数(从不在新代码中使用它)
- 如果日期之间的差异很大,可能会出现范围溢出 - 代码对夏令时没有任何了解 - 代码对时区没有任何了解 - 代码对闰秒没有任何了解

但在下面的情况下,我认为它的工作正确(这需要通过进一步的测试证明)
- 如果您只对纯执行持续时间感兴趣(两个日期都具有相同的时区基础,并且由于它的纯技术方面,可能会忽略夏令时)

所以现在由您来决定是从这个片段中取出一些内容还是更好地寻找其他解决方案。