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 zujava.time.ZoneId
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%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.