Joe*_*Joe 129 java datediff date java-7
TimeUnit.DAYS.convert(
Math.abs(
new SimpleDateFormat("dd-MM-yyyy HH:mm:ss").parse("30-03-2020 00:00:00").getTime() -
new SimpleDateFormat("dd-MM-yyyy HH:mm:ss").parse("1-03-2020 00:00:00").getTime()
),
TimeUnit.MILLISECONDS)
Run Code Online (Sandbox Code Playgroud)
结果是 28,而它应该是 29。
时区/位置可能是问题吗?
And*_*eas 211
问题在于,由于夏令时的变化(2020 年 3 月 8 日星期日),这些日期之间有28 天 23 小时。将结果TimeUnit.DAYS.convert(...)
截断为 28 天。
要查看问题(我在美国东部时区):
SimpleDateFormat fmt = new SimpleDateFormat("dd-MM-yyyy HH:mm:ss");
long diff = fmt.parse("30-03-2020 00:00:00").getTime() -
fmt.parse("1-03-2020 00:00:00").getTime();
System.out.println(diff);
System.out.println("Days: " + TimeUnit.DAYS.convert(Math.abs(diff), TimeUnit.MILLISECONDS));
System.out.println("Hours: " + TimeUnit.HOURS.convert(Math.abs(diff), TimeUnit.MILLISECONDS));
System.out.println("Days: " + TimeUnit.HOURS.convert(Math.abs(diff), TimeUnit.MILLISECONDS) / 24.0);
Run Code Online (Sandbox Code Playgroud)
输出
SimpleDateFormat fmt = new SimpleDateFormat("dd-MM-yyyy HH:mm:ss");
long diff = fmt.parse("30-03-2020 00:00:00").getTime() -
fmt.parse("1-03-2020 00:00:00").getTime();
System.out.println(diff);
System.out.println("Days: " + TimeUnit.DAYS.convert(Math.abs(diff), TimeUnit.MILLISECONDS));
System.out.println("Hours: " + TimeUnit.HOURS.convert(Math.abs(diff), TimeUnit.MILLISECONDS));
System.out.println("Days: " + TimeUnit.HOURS.convert(Math.abs(diff), TimeUnit.MILLISECONDS) / 24.0);
Run Code Online (Sandbox Code Playgroud)
要修复,请使用没有 DST 的时区,例如UTC:
SimpleDateFormat fmt = new SimpleDateFormat("dd-MM-yyyy HH:mm:ss");
fmt.setTimeZone(TimeZone.getTimeZone("UTC"));
long diff = fmt.parse("30-03-2020 00:00:00").getTime() -
fmt.parse("1-03-2020 00:00:00").getTime();
Run Code Online (Sandbox Code Playgroud)
输出
2502000000
Days: 28
Hours: 695
Days: 28.958333333333332
Run Code Online (Sandbox Code Playgroud)
MC *_*ror 41
安德烈亚斯的回答中已经提到了这个问题的原因。
问题是你到底想计算什么。您声明实际差异应该是 29 而不是 28,并询问“位置/区域时间是否可能是一个问题”这一事实表明您实际上想要计算什么。显然,您想摆脱任何时区差异。
我假设您只想计算天数,而没有时间和时区。
在下面的示例中,如何正确计算天数之间的天数,我使用了一个准确表示该天数的类 – 一个没有时间和时区的日期 – LocalDate
。
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("d-MM-yyyy HH:mm:ss");
LocalDate start = LocalDate.parse("1-03-2020 00:00:00", formatter);
LocalDate end = LocalDate.parse("30-03-2020 00:00:00", formatter);
long daysBetween = ChronoUnit.DAYS.between(start, end);
Run Code Online (Sandbox Code Playgroud)
需要注意的是ChronoUnit
,DateTimeFormatter
和LocalDate
至少需要Java 8,这是不提供给你,根据Java的7标记。然而,这也许是为了未来的读者。
正如 Ole VV 所提到的,还有ThreeTen Backport,它将 Java 8 日期和时间 API 功能向后移植到 Java 6 和 7。
归档时间: |
|
查看次数: |
14508 次 |
最近记录: |