【发布时间】:2021-01-20 14:08:02
【问题描述】:
场景
我有两个 UTC 时间戳,它们是7 days apart:
val timestamp1: Long = 1600642800000L // GMT => Sunday, September 20, 2020 11:00:00 PM
val timestamp1: Long = 1601247600000L // GMT => Sunday, September 27, 2020 11:00:00 PM
这里使用的时区是非洲/卡萨布兰卡。
val timeZone = DateTimeZone.forID("Africa/Casablanca")
然后,当我尝试为两个时间戳生成 offset 时,它显示出奇怪的行为:
timeZone.getOffset(timestamp1) // 3600000 milliseconds OR 1 hour
timeZone.getOffset(timestamp2) // 0 milliseconds
非洲/卡萨布兰卡目前自 2020 年 5 月 24 日起启用 Day Light Saving。当天的时钟提前 1 小时。所以,目前它位于UTC + 1 hr。当夏令时未激活时,它位于UTC + 0。
问题
那么,上述行为怎么可能?两个时间戳不应该生成相同的 1 小时偏移量吗? 这两个时间戳仅相隔 7 天,并且在这两个时间戳之间没有发生任何夏令时事件。
我尝试为其他时区重现类似的行为,但它们总是为这些时间戳产生与预期相同的偏移量。
对此行为的任何见解都会非常有帮助。
【问题讨论】:
-
您可能有一个过时版本的时区数据,它仍然具有摩洛哥的旧 DST 规则。更新您的 JRE 和/或运行 TZUpdater
-
将 JVM 更新为 openjdk 版本 "14.0.1" 。在尝试使用 latest tzdata 使用 TZUpdater 更新时区数据时,使用了命令:
java -jar tzupdater.jar -l file:tzdata2020a.tar.gz。日志说:JRE has the same version as the tzupdater provided one (tzdata2020a)。这可能意味着 JRE 现在拥有最新的 tz 数据。而且问题仍然存在。所以,我仍然不确定这里的问题是什么。 -
@OleV.V.我通过升级
Joda Time最新版本2.10.6进行了测试,它工作正常。我有 Java 版本openjdk version "11.0.8"。谢谢! -
作为一个更新,这个问题也可以通过使用原生 Java Time 而不是 Joda Time 来解决。
标签: java scala timezone jodatime timezone-offset