2015-07-16 10 views
7

Ich muss zwischen IANA Zeitzone & Windows Zeitzone & umgekehrt übersetzen. Es ist eine andere Frage berichtet: How to translate between Windows and IANA time zones?Wie übersetzt man zwischen Windows und IANA Zeitzonen in Java

Es gibt an, dass Noda Zeitbibliothek kann

in .Net verwendet werden, haben wir jede Bibliothek in Java verwendet werden? Oder irgendein anderes Dienstprogramm, das in Java benutzt wird?

+2

Es gibt bereits https://code.google.com/p/java-time-zone-list, aber das ist ein paar Jahre alt - ich vermute, es hat nicht das neue CLDR-Format für Windows-Zeitzonen genommen. Aber im Grunde wollen Sie das - die Daten von CLDR. –

+0

Möglicherweise müssen Sie dies selbst schreiben, indem Sie eine ähnliche Logik direkt mit den CLDR-Daten vergleichen. –

Antwort

0

Ich musste endlich meine eigene Implementierung machen. Die windowsZones.xml muss für viele fehlende Zeitzoneneinträge aktualisiert werden. Ich veröffentliche die aktualisierte Datei nicht, da es viele Zeitzonen gibt, wo es keine perfekte Übereinstimmung zwischen Windows-Offset & IANA-Offset gibt.

Auch, wie für eine Windows-Zeitzone könnte mehrere IANA-Zeitzone sein. Also, ich musste Implementierung entsprechend anderen verfügbaren Informationen wie Geographie des Benutzers (Adresse) etc. passend wählen.

Mit diesem benutze ich nur windowsZones.xml, um IANA Zeitzone von Windows Zeitzone & Vize zu erhalten -versa.

1

Dies kann sein, was Sie brauchen, aber ich weiß nicht, ob es für alle Anwendungsfälle funktionieren:

for (String tzId : TimeZone.getAvailableIDs()) { 
    TimeZone tz = TimeZone.getTimeZone(tzId); 
    if (tz.getDisplayName(Locale.ENGLISH).equals("Eastern Standard Time")) { 
    System.out.println("tz = " + tzId); 
    } 
} 
+1

Die englischen Anzeigenamen von Java stammen von CLDR (glaube ich). Sie werden nicht 1: 1 mit Windows Zeitzone Identifikatoren übereinstimmen. –

+0

Ja, die englischen Anzeigenamen von Java entsprechen nicht 1: 1 mit Windows-Zeitzonen-IDs. – Saurabhcdt

1

Ich habe support for Windows zones in meinem Java-Bibliothek Time4J umgesetzt. Die letzte Version v4.2 ist auch interoperable with Java-8, so dass es einfach ist, alle grundlegenden Time4J-Typen in java.time -Äquivalente zu konvertieren. Zum Beispiel erkennt Windows-Zonen als Strings möglich ist, sowie bei der Analyse des bei der Konstruktion:

// conversion Windows to IANA 
    WindowsZone wzn = WindowsZone.of("Eastern Standard Time"); 
    TZID winzone = wzn.resolveSmart(Locale.US); 
    System.out.println(winzone.canonical()); // WINDOWS~America/New_York 

    // usage in timezone calculation 
    Timezone tz = Timezone.of(winzone); 
    System.out.println(Moment.UNIX_EPOCH.toZonalTimestamp(winzone)); // 1969-12-31T19 

    // usage in parsing and formatting 
    ChronoFormatter<Moment> f = 
    ChronoFormatter.ofMomentPattern(
     "MM/dd/uuuu hh:mm a zzzz", PatternType.CLDR, Locale.US, winzone); 
    Moment pacificTime = f.parse("07/17/2015 02:45 PM Pacific Standard Time"); 
    System.out.println(f.format(pacificTime)); // 07/17/2015 05:45 PM Eastern Standard Time 

Wie Sie sehen können, eine locale Informationen eine Windows-Zone zur Karte wie „Eastern Standard Time“ zu einem Olson/IANA notwendig sind -ID wie "Amerika/New_York". Die zugrunde liegenden Daten und Mapping-Informationen stammen aus CLDR.

Der umgekehrte Weg von der IANA auf Windows könnte diese einfache Art und Weise erfolgen:

String iana = "America/New_York"; 
String winzone = "WINDOWS~" + iana; 
NameStyle dummy = NameStyle.LONG_STANDARD_TIME; // does not really matter 
String name = Timezone.of(winzone).getDisplayName(dummy, Locale.US); 
System.out.println(name); // Eastern Standard Time 

jedoch eine sehr vereinfachte Teilmenge von Zeitzonen diese umgekehrte Umwandlung funktionieren könnte nicht nur für alle IANA-Identifikatoren, da Windows unterstützt im Vergleich zu IANA-TZDB. Ich denke auch, dass der umgekehrte Weg in der Praxis kaum genutzt wird. Benutzer sollten lieber mit IANA-Zeitzonen arbeiten und nur Windows-Zeitzonen verwenden, wenn dies die (unvermeidliche) Eingabe ist (siehe ersten Teil meiner Antwort).

+0

Es scheint eine gute Option zu sein. Das Problem wird weiterhin bei der Konvertierung von IANA in Windows fortgesetzt, da wir mehrere IANA-IDs für eine Windows-Zeitzonen-ID haben. Wie ich bereits in meiner Antwort erwähnte, verwende ich windowsZones.xml und verwalte Interkonvertierungen, indem ich die Karte der IANA ID gegen die Windows TX ID und umgekehrt verwalte. – Saurabhcdt

Verwandte Themen