在这些情况下,为什么JVM的默认时区不同

时间:2016-12-21 08:28:27

标签: java date datetime jvm timezone

土耳其最近决定(2016年9月6日)永久停留在夏令时(DST)。此行为取消了之前计划于2016年10月30日04:00:00结束的夏令时。时钟没有改变。

土耳其介于+2和+3之间,所以现在它将保持在+3。在这里你可以看到

https://www.timeanddate.com/time/change/turkey/ankara?year=2016

*以上信息来自此链接,其中哪个问题与我的相似。 (Java timezone in turkey (rejected daylight saving)

直到今天,制造商已经提供了一些解决方案。例如,Windows为土耳其配置了时区 - (UTC + 03:00)伊斯坦布尔。但是,关于同一主题的一些问题仍然像我一样。

我开发使用jdk1.8.0_101的Java Web应用程序。我让它在Apache Tomcat 7.0上运行。在这个应用程序中,有时我使用日期对象但是,当我获得日期对象(新的Date())时,我发现JVM的默认时区与应用程序运行的OS(Windows但不同版本)的时区不同。

我在三种不同的环境中测试它。我在每个环境中使用相同的java代码和相同的jdk版本。 Java代码是;

TimeZone zone = TimeZone.getDefault();
System.out.println(zone.getDisplayName());
System.out.println(zone.getID());

TEST CASE-1) 我的笔记本电脑 - Windows 10 Pro(管理员用户) - 新的Date()对象返回 Wed Dec 21 10:00:38 EET 2016 测试代码结果:

Eastern European Time
Asia/Istanbul

enter image description here

==================================

TEST CASE-2) 我的Dektop PC - Windows 7 Service Pack 1(公司网络上受限制的用户) - 新的Date对象返回 Wed Dec 21 10:00: 38 EET 2016 测试代码结果:

Eastern European Time
Asia/Istanbul

enter image description here

==================================

TEST CASE-3) 虚拟服务器 - Windows Server 2008 R2 Enterprise(管理员用户) - 新的Date对象返回 Wed Dec 21 11:03:11 GMT + 03: 00 2016 测试代码结果:

GMT+03:00
GMT+03:00

enter image description here

==================================

****在第三个测试用例中,虚拟服务器返回正确的日期信息,但在其他情况下,它们会返回错误的日期。我知道我可以在获取日期对象时设置时区。但是,项目很大,这意味着我需要纠正很多日期对象。此外,第3个测试用例向我们展示了通过配置系统日期/时间可以解决问题。我能做些什么呢?我等你的推荐。

1 个答案:

答案 0 :(得分:3)

最新变化相关"土耳其从EET / EEST(+ 02 / + 03)转为永久+ 03"尚未集成到您正在使用的JDK8更新101中,实际上它不是最新的JDK 8更新112的一部分。您需要手动升级tzupgrader工具以获取JDK中的更改。 这是" tzdata2016g"将#34;土耳其从EET / EEST(+ 02 / + 03)切换为永久+ 03"集成,您可以在此处找到更多详细信息 - http://www.oracle.com/technetwork/java/javase/tzdata-versions-138805.html 你需要手动安装你可以从这里获得的tzupdator工具 - http://www.oracle.com/technetwork/java/javase/tzupdater-readme-136440.html 我希望能解决你的问题。