跨越两天之间的日子误会

时间:2017-04-29 00:10:05

标签: java date

当我想计算两个日期之间的天数时,我在Java中管理日期是错误的。

假设我们有两个不同的日期:

  • 日期1: 1986-01-24
  • 日期2: 2017-04-20

案例1:我使用日期代码片段:

SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
Date dt1 = format.parse("1986-01-24");
Date dt2 = format.parse("2017-04-20");
int intSpanInDays= (int) ((dt2.getTime() - dt1.getTime()) / (1000 * 60 * 60 * 24));
System.out.println("Days between: " + intSpanInDays);

输出1:

Days between: 11408

案例2 :使用日历的代码片段:

SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");

GregorianCalendar cal1 = new GregorianCalendar();
cal1.setTime(format.parse("1986-01-24"));
cal1.set(Calendar.HOUR, 0);
cal1.set(Calendar.MINUTE, 0);
cal1.set(Calendar.SECOND, 0);

GregorianCalendar cal2 = new GregorianCalendar();
cal2.setTime(format.parse("2017-04-20"));
cal2.set(Calendar.HOUR, 0);
cal2.set(Calendar.MINUTE, 0);
cal2.set(Calendar.SECOND, 0);
long spanInMillis = cal2.getTimeInMillis() - cal1.getTimeInMillis();

GregorianCalendar cal3 = new GregorianCalendar();
cal3.setTimeInMillis(spanInMillis);
long millisInADay = 1000 * 60 * 60 * 24;
System.out.println("Days between: " + (cal3.getTimeInMillis() / millisInADay));

输出2:

Days between: 11408

案例3 :在Excel中使用电子表格的示例:

当我使用MS Excel来实现这个跨度只是引入给定日期并简单地减去时,输出是这样的:

问题

为什么Java计算日期代码缺失一天?案例1和案例2中的缺失或错误与案例3中的结果不匹配?

2 个答案:

答案 0 :(得分:4)

电子表格正在考虑夏令时,你的计算是天真地截断,并且考虑到间隔中每天还有23小时,而不是25小时,那么23小时的剩余时间会被截断,结果比正确答案少一天。

答案 1 :(得分:2)

JDK 8通过其新的日期时间API大大简化了这些计算。使用以下代码可以准确地完成相同的操作:

LocalDate date1 = LocalDate.of(1986, 01, 24);
LocalDate date2 = LocalDate.of(2017, 04, 20);
System.out.println(date1.until(date2, ChronoUnit.DAYS));

这会自动处理任何/所有DST更改,闰年等,这在尝试手动进行计算时大多都会遗漏。