【问题标题】: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

【问题讨论】:

    标签: timezone jodatime dst


    【解决方案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。
    • 感谢您的解释。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-09
    • 1970-01-01
    • 2011-11-12
    • 2021-01-20
    • 2013-10-17
    • 1970-01-01
    相关资源
    最近更新 更多