如何解决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。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。