向java.util.date对象添加毫秒时出现错误结果



当前时间为Sat Apr 04 15:02:00 AEST 2020

在下面的代码段中,我创建了一个Date对象,并向其添加86400000L毫秒(1天(:

Date date = new Date();
date.setTime(date.getTime() + 86400000L);
System.out.println(date);

输出为Sun Apr 05 14:02:00 AEST 2020。我不明白为什么结果只增加了23小时,而不是24小时。

如有任何帮助,我们将不胜感激。

代码运行良好。输出中的AEST表示日期与Australian Eastern Standard Time有关。谷歌搜索AEST dst显示,2020年4月5日星期日凌晨3点,时钟将"倒退"1小时。因此,在夏令时变更前增加24小时,只会使时间提前23小时。

如果你明天运行那个代码,你就不会有这个"问题"。

请使用现代java日期和时间API java.time来进行日期和时间工作。

ZonedDateTime currentTime = ZonedDateTime.now(ZoneId.of("Australia/Sydney"));
System.out.println(currentTime);
ZonedDateTime tomorrowSameTime = currentTime.plusDays(1);
System.out.println(tomorrowSameTime);

刚才运行时的输出:

2020-04-04T16:00:30.579484+11:00[Australia/Sydney]
2020-04-05T16:00:30.579484+10:00[Australia/Sydney]

请注意:我们明天的时间是16:00。由于夏令时间(夏令时(结束,明天的UTC偏移量不同,为+10:00,而不是+11:00。重要的是,虽然我发现+ 86400000L几乎无法添加一天,但.plusDays(1)非常清楚地传达了意图。

如果需要,请插入不同的东澳大利亚时区。

您的代码出了什么问题cherouvim在另一个答案中已经很好地解释了这一点,我不需要重复。请允许我补充一点,Date类不仅设计得很糟糕——这会引起您的困惑——而且它已经过时很久了。我建议你不要使用它。正如cherouvim在评论中指出的那样,用日期编程很难。不要相信你自己可以将1天转换为8640000毫秒。将所有日期和时间计算留给经过验证的库方法。

链接:Oracle教程:日期时间解释如何使用java.Time.

最新更新