Java:日期差异

时间:2012-08-14 09:54:45

标签: java date

我正在使用Java开发日期。我发现两个日期之间的区别。

public static void main(String[] args) {
    final Date futDate = new GregorianCalendar(2012, 8, 15, 0, 0, 0).getTime();

    final Date currentDate = new GregorianCalendar().getTime();

    long diff = Math.round((futDate.getTime() - currentDate.getTime()) / 1000);

    System.out.println(diff / 86400 + " days");
    System.out.println((diff % 86400) / 3600 + " hrs");
    System.out.println(((diff % 86400) % 3600) / 60 + " mins");
    System.out.println((((diff % 86400) % 3600) % 60) % 60 + " secs");
}

输出:

31 days
8 hrs
37 mins
30 secs

即使日期差异小于一天,输出也会超过31天。

5 个答案:

答案 0 :(得分:8)

8不是当前月份数:)

月份编号为0

Java的日期很痛苦,所以我建议看看http://joda-time.sourceforge.net/

答案 1 :(得分:5)

更好的是,使用内置常量:

Calendar.AUGUST 

答案 2 :(得分:3)

  

我正在使用Java开发日期。

使用Joda Time

可以更好地
  

我发现两个日期之间存在差异。

Joda Time让这很简单:

LocalDateTime start = ...;
LocalDateTime end = ...;
Period period = new Period(start, end, PeriodType.dayTime());

System.out.println(period.getDays() + " days");
System.out.println(period.getHours() + " hrs");
System.out.println(period.getMinutes() + " mins");
System.out.println(period.getSeconds() + " secs");

答案 3 :(得分:0)

API

中所述,月份为0

所以你可能想把它设置为7而不是8。

同样,对于持续时间计算,Joda Time IMO非常复杂的时间API。

答案 4 :(得分:0)

dantuch接受的答案是正确的。 {1}}班级在1月至12月期间有0-11个月的疯狂编号。

使用java.time

麻烦的旧日期时间类如GregorianCalendar现在已经遗留下来,取而代之的是现代java.time类。

最重要的是,java.time类使用了数月的理智编号,1月到12月的1-12。 Month枚举使得数月的工作变得更加明确且不易出错。

您在确定日期时忽略了时区问题。您的代码隐式使用JVM的当前默认时区。通过从JVM中任何应用程序的任何线程中的任何代码调用,该默认值可以随时更改。最好明确你期望/预期的时区。

此外,您假设当天从GregorianCalendar开始。由于夏令时(DST)等异常现象并非总是如此。

00:00:00

...或...

LocalDate ld = LocalDate.of( 2012 , 8 , 15 );

让java.time确定当天的第一时刻。

LocalDate ld = LocalDate.of( 2012 , Month.AUGUST , 15 );

获取当前时刻。

ZoneId z = ZoneId.of( "America/Montreal" );
ZonedDateTime zdtThen = ld.atStartOfDay( z );

使用ZonedDateTime zdtNow = ZonedDateTime.now( z ); 课程获取经过的时间 - 小时 - 分钟 - 秒或Duration年 - 月 - 天。

Period

没有自动方式来构建您想要的字符串。在Java 9及更高版本中,您可以提取部件以构建自己的字符串:Duration d = Duration.between( zdtThen , zdtNow ); toDaysParttoHoursParttoMinutesPart

关于java.time

java.time框架内置于Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.DateCalendar和& SimpleDateFormat

现在位于Joda-Timemaintenance mode项目建议迁移到java.time类。

要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。规范是JSR 310

从哪里获取java.time类?

ThreeTen-Extra项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如IntervalYearWeekYearQuartermore