Differenze tra ZonedDateTime e OffsetDateTime

1. Panoramica

ZonedDateTime e OffsetDateTime sono classi piuttosto popolari nell'API DateTime di Java 8 . Inoltre, entrambi memorizzano un istante sulla timeline fino a una precisione di nanosecondi . E, all'inizio, potrebbe creare confusione scegliere tra di loro.

In questo breve tutorial, esamineremo le differenze tra ZonedDateTime e OffsetDateTime .

2. ZonedDateTime

Un ZonedDateTime è una rappresentazione immutabile di una data-ora con un fuso orario nel sistema di calendario ISO-8601, come 2007-12-03T10: 15: 30 + 01: 00 Europe / Pari s. Conserva lo stato equivalente a tre oggetti separati: LocalDateTime , ZoneId e ZoneOffset risolto .

Qui, ZoneId determina come e quando cambia l'offset. Quindi, l'offset non può essere impostato liberamente, poiché la zona controlla quali offset sono validi.

Per ottenere l'attuale ZonedDateTime per una regione specifica, useremo:

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

La classe ZonedDateTime fornisce anche metodi integrati per convertire una determinata data da un fuso orario a un altro:

ZonedDateTime destZonedDateTime = sourceZonedDateTime.withZoneSameInstant(destZoneId);

Infine, è completamente compatibile con l'ora legale e gestisce le regolazioni dell'ora legale. Spesso è utile quando vogliamo visualizzare un campo data-ora in un fuso orario specifico.

3. OffsetDateTime

Un OffsetDateTime è una rappresentazione immutabile di una data-ora con uno scostamento da UTC / Greenwich nel sistema di calendario ISO-8601, come 2007-12-03T10: 15: 30 + 01: 00 . In altre parole, memorizza tutti i campi di data e ora, con una precisione di nanosecondi, nonché l'offset da GMT / UTC .

Otteniamo l'attuale OffsetDateTime con un offset di due ore da GMT / UTC:

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

4. Le principali differenze

Innanzitutto, non ha senso (senza conversioni) confrontare direttamente due date con informazioni complete sul fuso orario. Pertanto, dovremmo sempre preferire la memorizzazione di OffsetDateTime nel database rispetto a ZonedDateTime , poiché le date con un offset di ora locale rappresentano sempre gli stessi istanti nel tempo.

Inoltre, a differenza di ZonedDateTime , l'aggiunta di un indice su una colonna che memorizza OffsetDateTime non cambierà il significato della data.

Riassumiamo rapidamente le differenze principali.

ZonedDateTime :

  • memorizza tutti i campi di data e ora, con una precisione di nanosecondi, e un fuso orario, con un offset di zona utilizzato per gestire data-ora locali ambigue
  • non può impostare liberamente gli offset, poiché la zona controlla i valori di offset validi
  • è completamente sensibile all'ora legale e gestisce le regolazioni dell'ora legale
  • è utile per visualizzare i campi data-ora in un fuso orario specifico dell'utente

OffsetDateTime :

  • memorizza tutti i campi di data e ora, con una precisione di nanosecondi, nonché l'offset da GMT / UTC (nessuna informazione sul fuso orario)
  • dovrebbe essere utilizzato per memorizzare una data nel database o per comunicarla in rete

5. conclusione

In questo tutorial, abbiamo coperto le differenze tra ZonedDateTime e OffsetDateTime .

Come al solito, il codice sorgente completo è disponibile su Github.