我使用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偏移?
答案 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安装最新的时区数据库。