英文:
Wrong results when adding milliseconds to java.util.date object
问题
当前时间是 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 小时。
希望能提供帮助。
英文:
Current time is Sat Apr 04 15:02:00 AEST 2020
.
In the following snippet, I create a Date object and add 86400000L milliseconds (1 day) to it:
Date date = new Date();
date.setTime(date.getTime() + 86400000L);
System.out.println(date);
The output is Sun Apr 05 14:02:00 AEST 2020
. I don't understand why the result adds only 23 hours to my current time, instead of 24 hours.
Any help would be appreciated.
答案1
得分: 2
这段代码运行得很好。你输出的 AEST
表示日期是指 澳大利亚东部标准时间
。搜索关于 AEST 夏令时
的内容显示,在2020年4月5日星期日凌晨3:00,时钟会“倒退”1小时。因此,在夏令时改变之前的24小时内,只会使时间提前23小时。
如果你明天运行这段代码,就不会有这个“问题”。
英文:
The code works just fine. The AEST
on your output means that the date regards Australian Eastern Standard Time
. Googling for AEST dst
shows that on Sunday, April 5, 3:00 am 2020 the clock will "go back" 1 hour. Thus adding 24 hours just before the DST change, will only move the time 23 hours forward.
If you run that code tomorrow, you'll not have this "problem".
答案2
得分: 1
使用java.time,现代的Java日期和时间API,来处理你的日期和时间工作。
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偏移不同,从+11:00变为+10:00。而且,重要的是,虽然我认为+ 86400000L
几乎难以阅读,用.plusDays(1)
可以非常清楚地传达意图。
如果需要,请插入另一个澳大利亚东部时区。
你的代码哪里出错了? cherouvim在另一个回答中已经很好地解释了这一点,我不需要重复。我只允许我补充一点,Date
类不仅设计得很糟糕,导致了你的困惑,而且它也已经过时了。我建议你不要使用它。正如cherouvim在评论中指出的那样,使用日期进行编程是很困难的。不要相信你可以自己将1天转换为86400000毫秒。将所有的日期和时间计算留给经过验证的库方法。
链接: Oracle教程:日期时间 解释了如何使用java.time。
英文:
Do use java.time, the modern Java date and time API, for your date and time work.
ZonedDateTime currentTime = ZonedDateTime.now(ZoneId.of("Australia/Sydney"));
System.out.println(currentTime);
ZonedDateTime tomorrowSameTime = currentTime.plusDays(1);
System.out.println(tomorrowSameTime);
Output when running just now:
> 2020-04-04T16:00:30.579484+11:00[Australia/Sydney]
> 2020-04-05T16:00:30.579484+10:00[Australia/Sydney]
Please observe: we got the same time of day tomorrow, 16:00. Because summer time (daylight saving time) ends, the UTC offset for tomorrow is different, +10:00 instead of +11:00. And importantly, while I find + 86400000L
pretty close to unreadable for adding a day, .plusDays(1)
conveys the intention very clearly.
Please insert a different Eastern Australian time zone if required.
What went wrong in your code? cherouvim has explained this very nicely in the other answer, no need for me to repeat. Only allow me to add that the Date
class is not only poorly designed — giving rise to your confusion — it is also long outdated. I recommend you don’t use it. And as cherouvim notes in a comment, programming with dates is hard. Don’t trust that you can yourself convert 1 day to 86 400 000 milliseconds. Leave all date and time calculations to proven library methods.
Link: Oracle tutorial: Date Time explaining how to use java.time.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论