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/London
或 2016-06-10 00:00 UTC
之间的毫秒。
你需要决定你想要哪个。
我目前正在编写一个应用程序,我需要检查是否有任何在昨天之前创建的文件并清理它们。在我尝试以下操作的那一刻:
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/London
或 2016-06-10 00:00 UTC
之间的毫秒。
你需要决定你想要哪个。