Java8 和夏令时

Java8 and Daylight Savings Time

我目前正在编写一个应用程序,我需要检查是否有任何在昨天之前创建的文件并清理它们。在我尝试以下操作的那一刻:

LocalDateTime today = LocalDate.now().atStartOfDay();
long todayEpoch = today.atZone(ZoneId.of("Europe/London")).toEpochSecond() * 1000;

并将毫秒转换回日期(在任何在线毫秒到日期转换器上)它告诉我我晚了 1 小时。

这是因为夏令时,这意味着我们是 GMT+1:00,这可能解释了 1 小时的差异。

为了解决这个问题,我必须将 Zone Id 更改为 UTC,如下所示:

final LocalDateTime today = LocalDate.now().atStartOfDay();
long todayEpoch = today.atZone(ZoneId.of("UTC")).toEpochSecond() * 1000;

但我仍然对它的工作原理感到困惑。

谁能解释为什么?

LocalDateTime today = LocalDate.now().atStartOfDay();

return 今天(在您的时区)在 00:00。所以如果今天是 2016 年 6 月 10 日,这将 return 2016-06-10 00:00.

today.atZone(ZoneId.of("Europe/London"))

将时区信息添加到日期,变成:2016-06-10 00:00 Europe/London,由于英国夏令时,与2016-06-09 23:00 UTC相同。

然后检索纪元秒,即 1970 年 1 月 1 日 00:00 UTC 与该时刻之间经过的秒数。

在您的第二个示例中,您计算​​纪元与 2016-06-10 01:00 Europe/London2016-06-10 00:00 UTC 之间的毫秒。

你需要决定你想要哪个。