Wie konvertiert man von org.joda.time.DateTime in java.time.ZonedDateTime

7

Ich habe eine Datenquelle mit joda-timeTime-Objekten gespeichert. Ich muss sie in Java-ZonedDateTime-Objekte konvertieren und dabei die ursprüngliche Zeitzone beibehalten.

Es ist nicht ausreichend, den Offset beizubehalten, da einige DateTime-Objekte sich täglich wiederholende Aufgaben darstellen und diese Aufgaben zu einem bestimmten Zeitpunkt in einer bestimmten Zeitzone für jedes Datum ausgeführt werden müssen. Sie müssen also den angegebenen TimeZone-Übergängen beispielsweise Sommer- und Winterzeit folgen. Ich kann die endgültige Verwendung der DateTime-Objekte nicht angeben, daher muss ich die Zeitzoneninformationen für alle Objekte als sicher aufbewahren.

Wie konvertiert man von org.joda.time.DateTime in java.time.ZonedDateTime?

Wird alle

  

ord.joda.time.DateTimeZone.getId ()

Ordnen Sie die in

verfügbaren IDs zu
  

java.time.ZoneId

    
Andreas Lundgren 05.03.2015, 12:33
quelle

2 Antworten

15

Nicht alle Zeitzonen-Strings von Joda-Time stimmen mit java.time überein, aber die überwiegende Mehrheit wird, da sie beide auf den IANA tz-Daten basieren. Vergleichen Sie DateTimeZone.getAvailableIDs() mit ZoneId.getAvailableZoneIds() , um das Missverhältnis zu ermitteln. Zusätzliche Bezeichner können mithilfe von ZoneId.of(String, Map) .

Um die Hauptkonvertierung möglichst effizient durchzuführen, müssen Sie jedes Feld übergeben:

%Vor%

Beachten Sie die Verwendung von ZoneId.SHORT_IDS als Map in diesem Fall.

Verwenden Sie für eine einfachere Lösung, die die meisten Anwendungsfälle behandelt, jedoch bei geringerer Leistung, Folgendes:

%Vor%     
JodaStephen 05.03.2015, 13:32
quelle
3

Sie sollten es vermeiden, jedes Feld einzeln anzugeben, wenn Sie mit Sommerzeitübergängen arbeiten. Konvertieren Sie stattdessen mit epochMillis, wie im folgenden Beispiel.

%Vor%

Andernfalls verlieren Sie eine Stunde am Tag des Übergangs. Zum Beispiel ist Deutschland am 29.10.2017 um 03:00 GMT + 2 von Sommerzeit (GMT + 2) auf Winterzeit (GMT + 1) umgesprungen, was 02:00 GMT + 1 wird. An diesem Tag haben Sie 2 Instanzen von 02:00 - eine frühere mit GMT + 2 und eine spätere mit GMT + 1.

Da Sie mit ZoneIds und nicht mit Offsets arbeiten, gibt es keine Möglichkeit zu wissen, welche der beiden Instanzen Sie haben möchten. Standardmäßig wird die erste während der Konvertierung angenommen. Sowohl 02:00 GMT + 2 als auch 02:00 GMT + 1 werden in 02:00 GMT + 2 konvertiert, wenn Sie hourOfDay zusammen mit ZoneId angeben.

    
Muhip Tezcan 11.12.2017 12:41
quelle