Ich habe die Dokumentation gelesen, kann aber immer noch nicht feststellen, wann ich das eine oder andere verwenden soll:
Laut Dokumentation OffsetDateTime
sollte beim Schreiben des Datums in die Datenbank verwendet werden, aber ich verstehe nicht warum.
ZonedDateTime
enthält a auch Informationen zu Zeitzonen, einschließlich Sommerzeitumschaltung usw. von dem, was ich gelesen habe.Antworten:
Die Javadocs sagen Folgendes:
Quelle: https://docs.oracle.com/javase/8/docs/api/java/time/OffsetDateTime.html
Der Unterschied zwischen
OffsetDateTime
undZonedDateTime
besteht darin, dass letzteres die Regeln enthält, die Anpassungen der Sommerzeit und verschiedene andere Anomalien abdecken.Einfach ausgedrückt:
Daten mit lokalen Zeitversätzen repräsentieren immer die gleichen Zeitpunkte und haben daher eine stabile Reihenfolge. Im Gegensatz dazu ist die Bedeutung von Datumsangaben mit vollständigen Zeitzoneninformationen angesichts von Anpassungen der Regeln für die jeweiligen Zeitzonen instabil. (Und diese passieren, z. B. für Datums- und Uhrzeitwerte in der Zukunft.) Wenn Sie also eine speichern und dann abrufen, hat
ZonedDateTime
die Implementierung ein Problem:Es kann den berechneten Versatz speichern ... und das abgerufene Objekt kann dann einen Versatz haben, der nicht mit den aktuellen Regeln für die Zonen-ID übereinstimmt.
Der berechnete Versatz kann verworfen werden ... und das abgerufene Objekt repräsentiert dann einen anderen Punkt in der absoluten / universellen Zeitleiste als den gespeicherten.
Wenn Sie die Java-Objektserialisierung verwenden, verfolgt die Java 9-Implementierung den ersten Ansatz. Dies ist wohl die "korrektere" Art, damit umzugehen, aber dies scheint nicht dokumentiert zu sein. (JDBC-Treiber und ORM-Bindungen treffen vermutlich ähnliche Entscheidungen und machen es hoffentlich richtig.)
Wenn Sie jedoch eine Anwendung schreiben, in der Datums- / Zeitwerte manuell gespeichert werden oder auf die Sie angewiesen sind
java.sql.DateTime
, sollten Sie sich wahrscheinlich mit den Komplikationen einer Zonen-ID auseinandersetzen. Daher der Rat.Beachten Sie, dass Daten, deren Bedeutung / Reihenfolge im Laufe der Zeit instabil ist , für eine Anwendung problematisch sein können. Und da Änderungen an Zonenregeln ein Randfall sind, können die Probleme zu unerwarteten Zeiten auftreten.
Ein (möglicher) zweiter Grund für den Rat ist, dass die Konstruktion von a
ZonedDateTime
an bestimmten Punkten nicht eindeutig ist. Wenn Sie beispielsweise in der Zeit, in der Sie die Uhren zurückstellen, eine Ortszeit und eine Zonen-ID kombinieren, können Sie zwei verschiedene Offsets erhalten. DieZonedDateTime
werden konsequent übereinander wählen ... aber das ist nicht immer die richtige Wahl.Dies könnte nun ein Problem für alle Anwendungen sein, die
ZonedDateTime
auf diese Weise Werte erstellen . Aus der Sicht einer Person, die eine Unternehmensanwendung erstellt, ist dies jedoch ein größeres Problem, wenn die (möglicherweise falschen)ZonedDateTime
Werte dauerhaft sind und später verwendet werden.quelle