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

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

当前时间是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小时。

任何帮助将不胜感激。

java date java.util.date
2个回答
2
投票

该代码可以正常工作。输出中的AEST表示日期为Australian Eastern Standard Time。搜寻AEST dst表示,在2020年4月5日星期日,凌晨3:00,时钟将“返回” 1小时。因此,在夏令时更改之前增加24小时,只会将时间向前移动23小时。

如果您明天运行该代码,则不会遇到此“问题”。


1
投票

为您的日期和时间工作,请使用现代的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天转换为8640万毫秒。将所有日期和时间计算留给经过验证的库方法。

Link: Oracle tutorial: Date Time解释如何使用java.time。

© www.soinside.com 2019 - 2024. All rights reserved.