JDK 土耳其时区问题("Asia/Istanbul" 或 "Europe/Istanbul")
JDK timezone issue on Turkey ("Asia/Istanbul" or "Europe/Istanbul")
任何人都可以帮助解决以下问题吗?
我的操作系统是最新的 windows 10,时区是 (UTC+0300) Istanbul
(夏令时已被删除,时区设置为 +0300
土耳其的最新规定 - 2016 年 9 月 7 日)
我正在使用最新的 JDK,即 1.8.0_131。此 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()));
}
}
代码的结果是:
Sun May 21 15: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”,而不是“Fri Jan 02 19:13:51 EET 1970.
除此之外,当我创建新的日期对象 (new java.util.Date()
) 时,该对象中的信息似乎是正确的并且时区在 +0300
,但是如果我使用 setTime
Date
对象时区信息的方法更改为 +0200
.
当使用 new java.util.Date()
创建日期对象时:
当localDate.setTime(155631515L)
方法执行时:
我也在其他 JDK 版本上重现了同样的问题。
土耳其的时区更改是在 2016 年 9 月。因此,对于 1970 年的日期,旧规则适用。那时,时区是 +0200,因为你有一个从一月开始的日期,所以没有添加夏令时。如果您尝试从 1970 年 7 月开始的日期,您应该与 UTC 相差 3 小时。
自 2016 年以来的变化虽然有时称为 'we use summertime all the year' 实际上意味着土耳其将其时区移动了一个小时,现在全年都采用新时区的非夏季时间。
如果您使用 2016 年 9 月左右的日期,您会发现计算发生变化的时间点。
任何人都可以帮助解决以下问题吗?
我的操作系统是最新的 windows 10,时区是
(UTC+0300) Istanbul
(夏令时已被删除,时区设置为+0300
土耳其的最新规定 - 2016 年 9 月 7 日)我正在使用最新的 JDK,即 1.8.0_131。此 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()));
}
}
代码的结果是:
Sun May 21 15: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”,而不是“Fri Jan 02 19:13:51 EET 1970.
除此之外,当我创建新的日期对象 (new java.util.Date()
) 时,该对象中的信息似乎是正确的并且时区在 +0300
,但是如果我使用 setTime
Date
对象时区信息的方法更改为 +0200
.
当使用 new java.util.Date()
创建日期对象时:
当localDate.setTime(155631515L)
方法执行时:
我也在其他 JDK 版本上重现了同样的问题。
土耳其的时区更改是在 2016 年 9 月。因此,对于 1970 年的日期,旧规则适用。那时,时区是 +0200,因为你有一个从一月开始的日期,所以没有添加夏令时。如果您尝试从 1970 年 7 月开始的日期,您应该与 UTC 相差 3 小时。
自 2016 年以来的变化虽然有时称为 'we use summertime all the year' 实际上意味着土耳其将其时区移动了一个小时,现在全年都采用新时区的非夏季时间。
如果您使用 2016 年 9 月左右的日期,您会发现计算发生变化的时间点。