土耳其JDK时区问题("亚洲/伊斯坦布尔"或"欧洲/伊斯坦布尔")

时间:2017-05-21 12:46:49

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

任何人都可以帮助解决以下问题吗?

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

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

  3. 这是我在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()));
        }
    }
    

    代码的结果是:

      

    Sun May 21 21:19:48 EET 2017

         

    Fri Jan 02 21:13:51 EET 1970

         

    Fri Jan 02 19:13:51 EET 1970

    根据最新的时区更新,最后一行输出应为" Fri Jan 02 18:13:51 EET 1970&#34 ;, not" Fri Jan 02 19 :13:51 EET 1970"。

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

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

    Screenshot when object created

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

    Screenshot when setTime(155631515L) method used

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

1 个答案:

答案 0 :(得分:4)

土耳其的时区变化发生在2016年9月。因此,对于1970年的日期,旧规则适用。那时,时区是+0200,并且从1月开始有一个日期,没有添加夏令时。如果您尝试1970年7月的日期,则与UTC相差3小时。

2016年的变化虽然有时被称为“我们全年都使用夏季”,但实际上意味着土耳其将其时区缩短了一个小时,现在新区域全年都没有夏季。

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