Joda Time无法正确处理夏时制转换

问题描述

场景

我有两个 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小时。未启用“夏令时”时,它位于UTC + 0

问题

那么,上述行为怎么可能?这两个时间戳记不应该产生相同的1小时偏移吗? 这两个时间戳仅相隔7天,在这两个时间戳之间没有发生任何夏令时事件。

我尝试在其他时区重现类似的行为,但是它们总是为那些时间戳产生相同的偏移量。

对此行为的任何见解都将非常有帮助。

解决方法

当我在使用Java 2.10.6的系统上将 Joda Time 库升级到最新版本openjdk version "11.0.8"时,此问题已解决。之所以起作用,是因为最新版本的Joda Time库具有最新的时区数据以及最近的Day Light Saving规则。我意识到使用最新版本并保持升级很重要,因为“日光节约”规则具有政治意义,并且可以由理事机构更改。

此外,我没有进行任何版本升级,还通过使用native Java Time api编写了相同的代码进行了测试。而且这样做也没有出现此问题。因此,从长远来看,我更喜欢使用Java Time。