4

我有以下代码成功地让我了解了两天之间的差异(以天、小时、分钟、秒为单位):

SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-DD HH:mm:ss");
Date d1 = format.parse(startTime);
Date d2 = format.parse(endTime);
long diff = d2.getTime() - d1.getTime();
long diffSeconds = diff / 1000 % 60;
long diffMinutes = diff / (60 * 1000) % 60;
long diffHours = diff / (60 * 60 * 1000) % 24;
long diffDays = diff / (24 * 60 * 60 * 1000);
System.out.println("Start: " + startTime);
System.out.println("End: " + endTime);
System.out.println(diffDays + " days, " + diffHours + " hours, " + diffMinutes + " minutes, " + diffSeconds + " seconds");

但是,当日期跨入另一个月份时,这不起作用,例如:

Start: 2013-07-31 10:15:01
End: 2013-08-01 11:22:33
-29 days, -22 hours, -52 minutes, -28 seconds

Start: 2013-05-31 10:15:01
End: 2013-08-01 11:22:33
-29 days, -22 hours, -52 minutes, -28 seconds

是否可以智能跨越数月并获得准确的时差?我对 Joda 很熟悉,但我想坚持使用标准的 Java API,除非没有 Joda 这样的东西是不可能的。

4

4 回答 4

5

虽然您应该将 Joda Time 简单地用作更好的日期/时间 API,但我怀疑问题实际上只是您错误地解析了值。使用格式字符串:

yyyy-MM-dd HH:mm:ss

... 用dd而不是DD. 该DD值是“一年中的一天”,我怀疑这会使事情变得混乱,基本上完全覆盖了月份部分。有关更多详细信息,请参阅SimpleDateFormat文档。

您可以通过打印出来d1d2在解析后验证问题所在...

于 2013-08-15T15:53:11.040 回答
4

您正在使用

SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-DD HH:mm:ss");

应该

SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

你会得到正确的结果

Start: 2013-05-31 10:15:01
End: 2013-08-01 11:22:33
62 days, 1 hours, 7 minutes, 32 seconds

这是日期模式的javadoc。dd是一个月中的一天。DD是一年中的一天。您的Date对象只是没有按照您预期的方式进行解析。基本上,一年中的日期值31覆盖了月份值。

调试器是你的朋友。

于 2013-08-15T15:53:09.847 回答
2
于 2016-11-15T22:23:51.223 回答
1

我认为您应该查看 joda-time 库http://joda-time.sourceforge.net/

Java 默认的日期实现有点糟糕,使用 joda time 您可以计算所需的时间间隔,并且它与 java Date 类兼容。

http://joda-time.sourceforge.net/quickstart.html(查看间隔和时间段)

于 2013-08-15T15:52:10.533 回答