【问题标题】:Joda Time not handling Day Light Saving transitions correctlyJoda Time 未正确处理夏令时转换
【发布时间】: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


【解决方案1】:

当我在我的系统上使用 Java openjdk version "11.0.8" 将 Joda Time 库升级到最新版本 2.10.6 时,此问题已得到解决。这样做的原因是最新版本的 Joda Time 库具有最新的夏令时规则的最新时区数据。我意识到使用最新版本并不断升级很重要,因为夏令时规则是政治性的,可以由管理机构更改。

另外,在没有做任何版本升级的情况下,我也用native Java Timeapi写了同样的代码进行了测试。而且通过这样做,这个问题也没有出现。所以,从长远来看,我更喜欢使用 Java Time。

【讨论】:

    猜你喜欢
    • 2012-08-30
    • 2016-02-01
    • 2016-04-09
    • 2013-11-23
    • 2012-10-16
    • 2011-04-29
    • 2014-05-19
    • 1970-01-01
    • 2018-03-27
    相关资源
    最近更新 更多