土耳其的Java时区(拒绝夏令时)

时间:2016-11-03 11:52:21

标签: java spring

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

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

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

...并在维基百科页面Time in Turkey和此Hurriyet Daily News文章Turkey to implement daylight savings time year-round

他们在这里讨论,但我在Spring Boot中有一个应用程序。

Android TimeZone Turkey GMT

cmntWrapper.setCreatedAtString(cmnt.getCreatedAt().
now(ZoneId.of(Constants.TURKEY_ZONE)).
format(DateTimeFormatter.ofPattern(Constants.DATE_TIME_FORMAT)));

这就是我约会的方式。

现在显示小时13.50,但现在是14.50。因为我们在+3。

我该怎么办?

我不想使用utc +3,因为他们可以说明年,"让我们再次使用+ 2- + 3切换到夏令时概念"。所以我不敢冒险。

我无法在未来几周更改代码,几周后它将保持永久性。

你对永久性的建议是什么?

还有我如何制作java?因为对于我的测试linux机器,请看这个

puapp @ PU-APP-01:〜$ java版 该程序' java'可以在以下包中找到:  * default-jre  * gcj-4.8-jre-headless  * openjdk-7-jre-headless  * gcj-4.6-jre-headless  * openjdk-6-jre-headless 尝试:sudo apt-get install puapp @ PU-APP-01:〜$

puapp @ PU-APP-01:〜$ whereis java java:/ usr / share / java puapp @ PU-APP-01:〜$

puapp @ PU-APP-01:〜$ whereis java java:/ usr / share / java

但在本地我有java。

vegan @ vegan:〜$ java -version java版" 1.8.0_111" Java(TM)SE运行时环境(版本1.8.0_111-b14) Java HotSpot(TM)64位服务器VM(版本25.111-b14,混合模式) 素食主义者@ vegan:〜$

但本地并不重要。那个linux服务器很重要。

对于我们的主机,有java

produp@Produp-app-01:~$ java -version
java version "1.8.0_91"
Java(TM) SE Runtime Environment (build 1.8.0_91-b14)
Java HotSpot(TM) 64-Bit Server VM (build 25.91-b14, mixed mode)
produp@Produp-app-01:~$ 

2 个答案:

答案 0 :(得分:5)

执行此操作的首选方法是更新JDK / JRE,如果它包含新的时区信息。如果不包括在内,正确且正式的方法是使用Timezone Updater Tool更新时区信息。

  

提供了TZUpdater工具,允许您使用更新的时区数据更新已安装的Java Development Kit(JDK)和Java Runtime Environment(JRE)软件,以适应不同国家/地区的夏令时(DST)更改。 Oracle依赖于通过IANA的时区数据库公开提供的时区数据。

     

Oracle建议您使用最新的Oracle Java SE平台JDK或JRE更新版本作为提供时区数据更新和其他产品改进(如安全修复程序)的首选方法。要查看哪个JDK或JRE更新版本包含您的语言环境的更新时区数据,请参阅JRE软件中的时区数据版本。但是,如果您无法使用Oracle的最新JDK或JRE更新版本,或者最新版本的时区数据不是最新版本,则TZUpdater工具提供了更新时区数据的方法,同时保留其他系统配置和依赖关系不变。

可以在official Java SE download site上下载(在其他资源部分下)。

可以找到有关您的特定案例的信息here(您还可以在其中看到JRE版本中没有该信息):

  

土耳其从EET / EEST(+ 02 / + 03)转为永久+03,有效2016-09-07。   新的闰秒2016-12-31 23:59:60 UTC根据IERS Bulletin C 52。

如何使用该工具在doucentation中解释:

  

TZUpdater工具修改用于执行该工具的JDK / JRE软件实例。每次执行都会修改JDK / JRE软件的单个映像。要将该工具管理到JDK / JRE软件的多个实例,请参阅“系统范围使用”一节。

例如,以下命令将使用最新信息更新JRE,其中应包括土耳其夏令时的更改。

  

java -jar tzupdater.jar -l http://www.iana.org/time-zones/repository/tzdata-latest.tar.gz

请注意,当前有known issue since the 2016g release

  

由于IANA维护的tzdata包中的格式更改,在解析tzdata2016.tar.gz资源包时,TZUpdater工具无法确定tzdata版本。

按照以下链接中的步骤操作,以便能够使用来自IANA的最新tzdata捆绑包。修复此问题后,将删除此部分答案。

答案 1 :(得分:2)

Answer by Magnilex是正确的,应该被接受。任何关心土耳其时间的人都需要立即更新他们与Java捆绑在一起的tz数据库。

the time zone data filestzdata2016g版本对您需要的土耳其进行了更改。

  

土耳其从EET / EEST(+ 02 / + 03)转为永久+03,有效2016-09-07。

版本tzdata2016h在20世纪80年代和90年代对土耳其有一些修正。

  

在土耳其,1986 - 1990年的过渡时间是标准时间01:00而不是02:00,1994年春季过渡时间是3月20日,而不是3月27日。

但是目前的Java SE 8 Update 111& 112具有早期版本tzdata2016f

tz自Java 8 Update 111

起未更新

我的下面的实验显示土耳其政府最后一刻的时区变化 not 包含在与Oracle最新Java更新捆绑在一起的tz database中,Java 8更新111。

在DST之前预定结束的那一天获得第一时间。然后一次添加一个小时以查看时钟是否跳跃。

System.out.println ( "java.version: " + System.getProperty ( "java.version" ) );

ZoneId z = ZoneId.of ( "Europe/Istanbul" );
ZonedDateTime zdt = ZonedDateTime.of ( 2016 , 10 , 30 , 0 , 0 , 0 , 0 , z );

System.out.println ( "    zdt: " + zdt );
System.out.println ( "zdt + 1: " + zdt.plusHours ( 1 ) );
System.out.println ( "zdt + 2: " + zdt.plusHours ( 2 ) );
System.out.println ( "zdt + 3: " + zdt.plusHours ( 3 ) );
System.out.println ( "zdt + 4: " + zdt.plusHours ( 4 ) );
System.out.println ( "zdt + 5: " + zdt.plusHours ( 5 ) );
System.out.println ( "zdt + 6: " + zdt.plusHours ( 6 ) );

运行时。凌晨4点,时钟跳回,重复03:00。这意味着DST已经结束,但如果我们了解新的土耳其法律,则不应该这样做。

java.version: 1.8.0_111
    zdt: 2016-10-30T00:00+03:00[Europe/Istanbul]
zdt + 1: 2016-10-30T01:00+03:00[Europe/Istanbul]
zdt + 2: 2016-10-30T02:00+03:00[Europe/Istanbul]
zdt + 3: 2016-10-30T03:00+03:00[Europe/Istanbul]
zdt + 4: 2016-10-30T03:00+02:00[Europe/Istanbul]
zdt + 5: 2016-10-30T04:00+02:00[Europe/Istanbul]
zdt + 6: 2016-10-30T05:00+02:00[Europe/Istanbul]