0

我正在使用 Java 中的 ZonedDateTime 库从标准时区列表(奥尔森时区数据库)中检索任何时区的 UTC 偏移量。

这是我的简单代码。

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 ID 列表

4

2 回答 2

1

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

查看修订历史,该更改是在版本 tzdata2016g 中引入的。在撰写本文时,最新版本的 JDK 是更新 111/112 ,它使用 tzdata2016f,因此没有正确的土耳其时区。

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

于 2017-01-12T09:43:36.860 回答
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
于 2017-01-11T22:36:57.607 回答