【问题标题】:JDK timezone issue on Turkey ("Asia/Istanbul" or "Europe/Istanbul")土耳其的 JDK 时区问题(“亚洲/伊斯坦布尔”或“欧洲/伊斯坦布尔”)
【发布时间】:2023-03-11 11:39:01
【问题描述】:

谁能帮忙解决以下问题?

  1. 我的操作系统是最新的 windows 10,它的时区是 (UTC+0300) Istanbul(在土耳其的最后规定 - 2016 年 9 月 7 日之后,夏令时已被删除,时区设置为 +0300

  2. 我使用的是 1.8.0_131 的最新 JDK。此 JDK 的 Tzdata 版本是 tzdata2017a,其中包括土耳其的时区更改。

这是我在 main 方法中实现的应用程序的一小部分:

import java.util.Date;
import java.util.TimeZone;

public class TestMain {
  
    public static void main(String[] args) {
        String timeZoneStr = "Asia/Istanbul";
        TimeZone timeZone = TimeZone.getTimeZone(timeZoneStr);
        Date localDate = new Date();
        System.out.println(localDate);
        localDate.setTime(155631515L);
        System.out.println(localDate);
        System.out.println(getUTCFromLocal(localDate, timeZone));
   }

    public static Date getUTCFromLocal(Date localDate, TimeZone localTimeZone) {
         return new Date(localDate.getTime()-localTimeZone.getOffset(localDate.getTime()));
    }
}

代码的结果是:

2017 年 5 月 21 日星期日 15:19:48 EET

1970 年 1 月 2 日星期五 21:13:51 EET

1970 年 1 月 2 日星期五 19:13:51 EET

根据最新的时区更新,输出的最后一行应该是“Fri Jan 02 18:13:51 EET 1970”,而不是“Fri Jan 02 19:13:51 EET 1970”。

除此之外,当我创建新的日期对象 (new java.util.Date()) 时,该对象中的信息似乎正确且时区在 +0300,但如果我使用 setTimesetTime 方法 @ 对象时区信息更改为+0200

当使用new java.util.Date()创建日期对象时:

localDate.setTime(155631515L)方法执行时:

我也在其他 JDK 版本上重现了同样的问题。

【问题讨论】:

    标签: java java-8 timezone java-7 timezone-offset


    【解决方案1】:

    土耳其的时区更改是在 2016 年 9 月。因此,对于 1970 年的日期,旧规则适用。那时,时区是 +0200,因为你的日期是一月,所以没有添加夏令时。如果您尝试从 1970 年 7 月开始的日期,您应该与 UTC 相差 3 小时。

    从 2016 年开始的变化虽然有时被称为“我们全年使用夏令时”,但实际上意味着土耳其将其时区移动了一个小时,现在全年都有新时区的非夏令时。

    如果您使用 2016 年 9 月左右的日期,您会发现计算发生变化的点。

    【讨论】:

    • 实际上,自 1970 年以来,规则已经改变了 许多 次。您可以查看 the entire tzdb entry,也可以直接查看 time in 1970 in Istanbul。但你是对的,1970 年 1 月确实是 +0200。:)
    • @MattJohnson 非常感谢您的添加以及指向 tzdb 条目的链接
    猜你喜欢
    • 2016-04-05
    • 2016-11-16
    • 1970-01-01
    • 1970-01-01
    • 2015-03-29
    • 2013-12-21
    • 2016-01-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多