当我想计算两个日期之间的天数时,我在Java中管理日期是错误的。
假设我们有两个不同的日期:
案例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中的结果不匹配?
答案 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更改,闰年等,这在尝试手动进行计算时大多都会遗漏。