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

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

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

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

……在维基百科页面, 土耳其时间以及这篇Hurriyet Daily News文章中, 土耳其全年实施夏令时

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

Android TimeZone土耳其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 version“1.8.0_111”Java(TM)SE运行时环境(版本1.8.0_111-b14)Java HotSpot(TM)64位服务器VM(版本25.111-b14,混合模式)素食主义者@素食主义者:〜$

但是当地并不重要。 那个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:~$ 

如果它包含新的时区信息,那么首选的方法是更新JDK / JRE。 如果未包含此选项,则执行此操作的正确方法应该是使用时区更新工具更新时区信息。

提供了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工具提供了更新时区数据的方法,同时保持其他系统配置和依赖关系不变。

可以在官方Java SE下载站点 (在“ 其他资源 ”部分下载)下载 。

您可以在此处找到有关您的特定案例的信息(您还可以在其中看到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软件的多个实例,请参阅Systemwide Usage部分。

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

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


请注意, 自2016g版本以来,目前存在一个已知问题 :

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

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

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

版本tzdata2016g 的时区数据文件具有您需要的土耳其更改。

土耳其从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开始未更新

我的实验如下所示,土耳其政府最后一刻的时区变化并未包含在最新的Java更新Java捆绑的tz数据库中 ,Java 8 Update 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]