Java ZonedDateTime提供了错误的UTC偏移值

Java ZonedDateTime提供了错误的UTC偏移值,java,datetime,timezone,timezone-offset,zoneddatetime,Java,Datetime,Timezone,Timezone Offset,Zoneddatetime,我使用Java中的ZonedDateTime库从标准时区列表(Olson时区数据库)中检索任何时区的UTC偏移量 这是我的简单代码 import java.time.ZoneId; import java.time.ZonedDateTime; public class HelloWorld{ public static void main(String []args){ displayUtcOffset("Europe/Istanbul"); dis

我使用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偏移量


注意:

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

    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

你考虑过夏令时了吗?例如,在夏季检查时间时,如下所示:

    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

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

综上所述,tzdata2016g版本中引入了此更改。在撰写本文时,JDK的最新版本是更新111/112,因此没有适用于土耳其的正确时区


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

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

综上所述,tzdata2016g版本中引入了此更改。在撰写本文时,JDK的最新版本是更新111/112,因此没有适用于土耳其的正确时区


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

这就是问题所在。即使伊斯坦布尔没有夏令时,这个图书馆仍在考虑。有办法解决这个问题吗?或者我需要切换到另一个库吗?哦,我不知道Turkey通过了DST(对他们有好处!)。那么说明已经给出了,这就是问题所在。即使伊斯坦布尔没有夏令时,这个图书馆仍在考虑。有办法解决这个问题吗?或者我需要切换到另一个库吗?哦,我不知道Turkey通过了DST(对他们有好处!)。那么说明已经给出了