Unterschiede zwischen ZonedDateTime und OffsetDateTime

1. Übersicht

ZonedDateTime und OffsetDateTime sind sehr beliebte Klassen in der Java 8 DateTime- API . Darüber hinaus speichern beide einen Moment auf der Timeline bis zu einer Genauigkeit von Nanosekunden . Und zunächst kann es verwirrend werden, zwischen ihnen zu wählen.

In diesem kurzen Tutorial werden wir uns die Unterschiede zwischen ZonedDateTime und OffsetDateTime ansehen .

2. ZonedDateTime

Eine ZonedDateTime ist eine unveränderliche Darstellung einer Datums- und Uhrzeitangabe mit einer Zeitzone im ISO-8601-Kalendersystem, z. B. 2007-12-03T10: 15: 30 + 01: 00 Europe / Paris . Der Status entspricht drei separaten Objekten: einer LocalDateTime , einer ZoneId und dem aufgelösten ZoneOffset .

Hier bestimmt die ZoneId , wie und wann sich der Offset ändert. Daher kann der Versatz nicht frei eingestellt werden, da die Zone steuert, welche Versätze gültig sind.

Um die aktuelle ZonedDateTime für eine bestimmte Region abzurufen , verwenden wir:

ZoneId zone = ZoneId.of("Europe/Berlin"); ZonedDateTime zonedDateTime = ZonedDateTime.now(zone);

Die ZonedDateTime- Klasse bietet außerdem integrierte Methoden zum Konvertieren eines bestimmten Datums von einer Zeitzone in eine andere:

ZonedDateTime destZonedDateTime = sourceZonedDateTime.withZoneSameInstant(destZoneId);

Schließlich ist es vollständig DST-fähig und übernimmt Anpassungen der Sommerzeit. Dies ist häufig nützlich, wenn ein Datums- / Uhrzeitfeld in einer bestimmten Zeitzone angezeigt werden soll.

3. OffsetDateTime

Eine OffsetDateTime ist eine unveränderliche Darstellung einer Datums- und Uhrzeitangabe mit einem Versatz von UTC / Greenwich im ISO-8601-Kalendersystem, z. B. 2007-12-03T10: 15: 30 + 01: 00 . Mit anderen Worten, es speichert alle Datums- und Zeitfelder mit einer Genauigkeit von Nanosekunden sowie den Versatz von GMT / UTC .

Lassen Sie uns die aktuelle OffsetDateTime mit einem zweistündigen Offset von GMT / UTC abrufen :

ZoneOffset zoneOffSet= ZoneOffset.of("+02:00"); OffsetDateTime offsetDateTime = OffsetDateTime.now(zoneOffSet);

4. Die Hauptunterschiede

Erstens ist es nicht sinnvoll (ohne Conversions), zwei Daten direkt mit vollständigen Zeitzoneninformationen zu vergleichen. Daher sollten wir es immer vorziehen, OffsetDateTime in der Datenbank gegenüber ZonedDateTime zu speichern , da Daten mit einem lokalen Zeitversatz immer dieselben Zeitpunkte darstellen.

Im Gegensatz zur ZonedDateTime ändert das Hinzufügen eines Index über einer Spalte, in der die OffsetDateTime gespeichert ist, die Bedeutung des Datums nicht.

Lassen Sie uns die wichtigsten Unterschiede schnell zusammenfassen.

ZonedDateTime :

  • speichert alle Datums- und Zeitfelder mit einer Genauigkeit von Nanosekunden und einer Zeitzone mit einem Zonenversatz, der zur Behandlung mehrdeutiger lokaler Datums- und Uhrzeitangaben verwendet wird
  • Offsets können nicht frei gesetzt werden, da die Zone die gültigen Offsetwerte steuert
  • ist vollständig DST-fähig und übernimmt Anpassungen der Sommerzeit
  • Dies ist praktisch, um Datums- und Uhrzeitfelder in einer benutzerspezifischen Zeitzone anzuzeigen

OffsetDateTime :

  • speichert alle Datums- und Zeitfelder mit einer Genauigkeit von Nanosekunden sowie den Versatz von GMT / UTC (keine Zeitzoneninformationen)
  • sollte zum Speichern eines Datums in der Datenbank oder zur Kommunikation über ein Netzwerk verwendet werden

5. Schlussfolgerung

In diesem Tutorial haben wir die Unterschiede zwischen ZonedDateTime und OffsetDateTime behandelt .

Wie üblich ist der vollständige Quellcode auf Github verfügbar.