我正在使用Java中的ZonedDateTime库来检索标准时区列表(Olson时区数据库)中任何时区的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偏移是正确的,但伊斯坦布尔的UTC偏移实际上是+3,但其输出为+2,这是不正确的。
这个Java库的工作方式是否有所改变?还是有一个更可靠的库将olson Id转换为UTC偏移量?

注意:olson Ids List

最佳答案

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

    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

10-05 18:23