为什么2020年3月30日与2020年3月1日之间的差是错误的28天而不是29天?

问题描述 投票:1回答:1

为什么3月30日和3月1日之间的差额将错误的28天而不是29天指定为错误的天?

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)

结果是28,应该是29。可能是位置/区域时间问题?

java date java-7 datediff
1个回答
2
投票

问题在于,由于夏时制的改变(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) / 24d);

输出

2502000000
Days: 28
Hours: 695
Days: 28.958333333333332

要解决,请使用没有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();

输出

2505600000
Days: 29
Hours: 696
Days: 29.0
© www.soinside.com 2019 - 2024. All rights reserved.