2017-05-21 1 views
4

Kann jemand mit folgendem Problem helfen?JDK-Zeitzonenproblem in der Türkei ("Asien/Istanbul" oder "Europa/Istanbul")

  1. Mein Betriebssystem ist die neueste Windows 10 und seine Zeitzone ist (UTC+0300) Istanbul (Sommer wurde entfernt, und die Zeitzone wurde +0300 nach den letzten Vorschriften in der Türkei festgelegt - 7. September 2016)

  2. I verwende das neueste JDK, welches 1.8.0_131 ist. Tzdata-Version dieses JDK ist tzdata2017a, die Zeitzone Änderungen für die Türkei enthält.

Dies ist winziger Teil meiner Anwendung, die ich in main-Methode implementiert:

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())); 
    } 
} 

Ergebnis des Codes ist:

Sun 21. Mai 15.19.48 EET 2017

Fr 2. Januar 21.13.51 EET 1970

Fr Jan 02 19.13.51 EET 1970

Nach neuester Update Zeitzone sollte letzte Zeile der Ausgabe sein "Fri 2. Januar 18.13.51 EET 1970", nicht „Fr 2. Januar 19.13 : 51 EET 1970 ".

In additon dazu, wenn ich neues Date-Objekt (new java.util.Date()) erstellen, scheinen die Informationen in diesem Objekt korrekt und Zeitzone auf +0300, aber wenn ich setTime Methode der Date Objekt Zeitzoneninformationen verwenden, um Änderungen zu +0200. auch gleiche Problem auf andere JDK-Versionen reproduziert

Screenshot when setTime(155631515L) method used

I:

Wenn Datum Objekt mit new java.util.Date() erstellt:

Screenshot when object created

Wenn localDate.setTime(155631515L) Methode ausgeführt.

Antwort

3

Der Zeitzonenwechsel in der Türkei war im September 2016. Für ein Datum im Jahr 1970 gelten also die alten Regeln. Zu dieser Zeit war die Zeitzone +0200, und da Sie ein Datum von Januar haben, wurde keine Sommerzeit hinzugefügt. Wenn Sie ein Datum von Juli 1970 versuchen, sollten Sie eine Differenz von 3 Stunden zu UTC haben.

Die Änderung von 2016, obwohl manchmal auch "wir nutzen Sommer das ganze Jahr" genannt wird, bedeutet, dass die Türkei ihre Zeitzone um eine Stunde verschoben hat und die neue Zone nun das ganze Jahr über keine Sommerzeit hat.

Wenn Sie mit den Daten um September 2016 herumspielen, werden Sie den Punkt finden, wo sich die Berechnung ändert.

+1

Eigentlich haben sich die Regeln * viele * mal seit 1970 geändert. Sie können [den gesamten tzdb-Eintrag] (https://github.com/eggert/tz/blob/2017a/europe#L3505-L3652), oder überprüfen Sie können einfach [Zeit in Istanbul 1970] (https://www.timeanddate.com/time/zone/turkey/istanbul?year=1970) auschecken.Aber du hast Recht, es war in der Tat +200 im Januar 1970. :) –

+0

@MattJohnson vielen dank für die Ergänzung und für den Link zum tzdb-Eintrag –

Verwandte Themen