当前时间是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:00,时钟将“返回” 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天转换为8640万毫秒。将所有日期和时间计算留给经过验证的库方法。
Link: Oracle tutorial: Date Time解释如何使用java.time。