ZonedDateTime提供不正确的UTC偏移值

时间:2017-01-11 22:34:56

标签: java datetime timezone timezone-offset zoneddatetime

我使用Java的ZonedDateTime库来检索任何时区的UTC偏移量,超出标准时区列表(Olson时区数据库)。

这是我的简单代码。

import java.time.ZoneId;
import java.time.ZonedDateTime;

public class HelloWorld{

    public static void main(String []args){
        displayUtcOffset("Europe/Istanbul");
        displayUtcOffset("America/Caracas");
    }

    public static void displayUtcOffset(String olsonId){
        ZonedDateTime zonedDateTime = ZonedDateTime.now(ZoneId.of(olsonId));
        float utcOffset = zonedDateTime.getOffset().getTotalSeconds()/3600f;
        System.out.println("For "+olsonId+", UTC"+utcOffset);
    }
}

这些的输出是,

For Europe/Istanbul, UTC2.0
For America/Caracas, UTC-4.5

正如我们所看到的加拉加斯的UTC偏移是正确的,但伊斯坦布尔的实际上是+3,但它输出为+2,这是不正确的。 这个java库的工作方式有变化吗?或者是否有更可靠的库将olson Id转换为UTC偏移?

注意:olson Ids List

2 个答案:

答案 0 :(得分:1)

您是否考虑了夏令时?例如,当您在夏天检查时间时,如下所示:

    public static void displayUtcOffset(String olsonId){
        ZonedDateTime zonedDateTime = ZonedDateTime.of(2017, 7, 15, 1, 1, 11, 1, ZoneId.of(olsonId));
        float utcOffset = zonedDateTime.getOffset().getTotalSeconds()/3600f;
        System.out.println("For "+olsonId+", UTC"+utcOffset);
    }

输出与您的预期一致:

For Europe/Istanbul, UTC3.0
For America/Caracas, UTC-4.5

答案 1 :(得分:1)

土耳其最近停止观察DST,您的时区数据库可能不是最新的。

查看the revision history,更改是在版本tzdata2016g中引入的。在撰写本文时,最新版本的JDK是更新111/112 which use tzdata2016f,因此没有土耳其的正确时区。

您可以等待可能包含更正的JDK的下一次更新,也可以使用the Timezone Updater Tool安装最新的时区数据库。