为啥这个 Joda 偏移不能正确实现夏令时

Posted

技术标签:

【中文标题】为啥这个 Joda 偏移不能正确实现夏令时【英文标题】:Why this Joda offset cannot get daylightsaving right为什么这个 Joda 偏移不能正确实现夏令时 【发布时间】:2014-10-16 17:18:35 【问题描述】:

例如,我有以下代码使用 Joda 来计算任何给定日期的偏移量

int offset = DateTimeZone.forID("EST").getOffset(new DateTime(2013,8,1,1,1));

这会给我 -18000000 的偏移量。但是对于:

 int offset = DateTimeZone.forID("EST").getOffset(new DateTime(2012,12,1,1,1));

这也给了我 -18000000 的偏移量。

看起来夏令时没有考虑到计算中。有谁知道为什么?谢谢。

我正在使用 Joda-time-2.3

【问题讨论】:

【参考方案1】:

您需要提供一个时区 ID,而不是“一半”时区的缩写。例如,America/New_York 是东部时间的时区 ID 的一个示例(还有其他时区,时区可能现在像纽约,但在历史上不是这样)。

import org.joda.time.*;

class Test 
    public static void main(String[] args) 
        DateTimeZone zone = DateTimeZone.forID("America/New_York");
        System.out.println(zone.getOffset(new DateTime(2013,8,1,1,1)));
        System.out.println(zone.getOffset(new DateTime(2012,12,1,1,1)));
   

输出:

-14400000
-18000000

您应该尽可能远离缩写形式 - 它们是模棱两可的(非唯一的)并且通常只定义时区的一部分。艾克。

【讨论】:

引用您的OMG PONIES!!! (AKA HUMANITY: EPIC FAIL) 演示文稿:“是的,CST 出现了三次。一次是美国的中部标准时间——UTC-6。它也是澳大利亚的中部标准时间——那里是 UTC +9.30。这也是澳大利亚的中部夏令时间,UTC+10.30。我认为在同一个地方使用相同的首字母缩写词来表示不同的偏移量是一种特殊的无能。”【参考方案2】:

您明确告诉它忽略夏令时。

EST 是东部标准时间,与 EDT 明显不同,后者是夏令时。

请尝试使用 ID US/Eastern,所以

DateTimeZone.forID("US/Eastern")

可以找到可用时区的完整列表here。 US/Eastern 是 America/New_York 的别名

【讨论】:

我检查了列表。 EST 不也在列表中吗?那么我们应该使用“Canonical ID”还是“Alias”呢? Canonical ID 或 Alias 都可以。 EST 的问题在于 EST 代表东部标准时间。东部标准时间与俗称的“东部时间”不同。东部标准时间是明确的东部时间,而不是夏令时。为了获得夏令时,我建议使用 US/Eastern 或 America/New_York。 感谢您的解释。

以上是关于为啥这个 Joda 偏移不能正确实现夏令时的主要内容,如果未能解决你的问题,请参考以下文章

如何在没有 Joda Time 的情况下在 Java 7 中正确处理夏令时?

JODA 夏令时转换

在 Joda Time 的帮助下使用夏令时的正确方法

Joda-Time、夏令时更改和日期时间解析

Joda-Time,夏令时计算,时区独立测试

没有时区的时间戳中的夏令时时间偏移