ZoneOffset in Java

1. Introduzione

Nel nostro mondo, ogni paese segue un determinato fuso orario. Questi fusi orari sono fondamentali per esprimere il tempo in modo conveniente ed efficace. Tuttavia, i fusi orari a volte possono essere inespliciti a causa di variabili come l'ora legale, che entrano nell'immagine.

Inoltre, pur rappresentando questi fusi orari nel nostro codice, le cose possono creare confusione. Java ha fornito in passato più classi come Date , Time e DateTime per occuparsi anche dei fusi orari.

Tuttavia, le nuove versioni di Java hanno creato classi più utili ed espressive come ZoneId e ZoneOffset , per la gestione dei fusi orari.

In questo articolo, discuteremo di ZoneId e ZoneOffset , nonché delle classi DateTime correlate .

Possiamo anche leggere del nuovo set di classi DateTime introdotto in Java 8, nel nostro precedente post.

2. ZoneId e ZoneOffset

Con l'avvento di JSR-310, sono state aggiunte alcune API utili per la gestione di data, ora e fusi orari. Come parte di questo aggiornamento, sono state aggiunte anche le classi ZoneId e ZoneOffset .

2.1. ZoneId

Come indicato sopra, ZoneId è una rappresentazione del fuso orario come " Europa / Parigi ".

Ci sono 2 implementazioni di ZoneId . Innanzitutto, con un offset fisso rispetto a GMT / UTC. E secondo, come regione geografica, che ha una serie di regole per calcolare l'offset con GMT / UTC.

Creiamo uno ZoneId per Berlino, Germania:

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

2.2. ZoneOffset

ZoneOffset estende ZoneId e definisce l'offset fisso del fuso orario corrente con GMT / UTC , ad esempio +02: 00.

Ciò significa che questo numero rappresenta ore e minuti fissi, che rappresentano la differenza tra l'ora nel fuso orario corrente e GMT / UTC:

LocalDateTime now = LocalDateTime.now(); ZoneId zone = ZoneId.of("Europe/Berlin"); ZoneOffset zoneOffSet = zone.getRules().getOffset(now);

Nel caso in cui un paese abbia 2 diversi offset: in estate e in inverno, ci saranno 2 diverse implementazioni di ZoneOffset per la stessa regione, da qui la necessità di specificare un LocalDateTime .

3. Classi DateTime

Successivamente discutiamo alcune classi DateTime , che in realtà sfruttano ZoneId e ZoneOffset .

3.1. ZonedDateTime

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. Un ZonedDateTime mantiene lo stato equivalente a tre oggetti separati, un LocalDateTime , uno ZoneId e lo ZoneOffset risolto .

Questa classe memorizza tutti i campi di data e ora, con una precisione di nanosecondi, e un fuso orario, con uno ZoneOffset , per gestire date-ore locali ambigue. Ad esempio, ZonedDateTime può memorizzare il valore "2 ottobre 2007 alle 13: 45.30.123456789 +02: 00 nel fuso orario Europa / Parigi".

Otteniamo l'attuale ZonedDateTime per la regione precedente:

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

ZonedDateTime fornisce anche funzioni integrate, per convertire una data data da un fuso orario a un altro:

ZonedDateTime destDate = sourceDate.withZoneSameInstant(destZoneId);

3.2. OffsetDateTime

OffsetDateTime è una rappresentazione immutabile di una data-ora con un offset nel sistema di calendario ISO-8601, come 2007-12-03T10: 15: 30 + 01: 00 .

Questa classe memorizza tutti i campi di data e ora, con una precisione di nanosecondi, nonché l'offset da GMT / UTC . Ad esempio, OffsetDateTime può memorizzare il valore "2 ottobre 2007 alle 13: 45.30.123456789 +02: 00".

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

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

3.3. OffsetTime

OffsetTime è un oggetto data-ora immutabile che rappresenta un'ora, spesso vista come offset ora-minuto-secondo, nel sistema di calendario ISO-8601, ad esempio 10: 15: 30 + 01: 00 .

Questa classe memorizza tutti i campi temporali, con una precisione di nanosecondi, nonché un offset di zona . Ad esempio, OffsetTime può memorizzare il valore "13: 45.30.123456789 + 02: 00".

Otteniamo l'attuale OffsetTimecon 2 ore di offset:

ZoneOffset zoneOffSet = ZoneOffset.of("+02:00"); OffsetTime time = OffsetTime.now(zoneOffSet);

4. Conclusione

Tornando al punto focale, ZoneOffset è una rappresentazione del fuso orario in termini di differenza tra GMT / UTC e l'ora data. Questo è un modo pratico per rappresentare il fuso orario, sebbene siano disponibili anche altre rappresentazioni.

Inoltre, ZoneId e ZoneOffset non vengono utilizzati solo in modo indipendente, ma anche da alcune classi Java DateTime come ZonedDateTime , OffsetDateTime e OffsetTime .

Come al solito, il codice è disponibile nel nostro repository GitHub.