1. ZonedDateTimeclasse

C'è un'altra classe molto interessante nell'API Date Time: la ZonedDateTimeclasse. Il suo scopo principale è rendere conveniente lavorare con date in diversi fusi orari.

LocalDateè ottimo per rappresentare le date. Ad esempio, i compleanni. Il mio compleanno è il 15 marzo, non importa dove mi trovo. Questo è un esempio di data.

LocalTimeè bello descrivere il tempo, come l'ora impostata su una sveglia: metto la sveglia alle 5:00 e non importa dove mi trovo. Le 5:00 sono le 5:00. Questo è un esempio di come lavorare con il tempo.

Ora diciamo che stiamo scrivendo un'applicazione che prenota i voli. Gli aerei decollano e arrivano in base all'ora locale. L'aereo è in volo per un tempo fisso, ma i fusi orari possono cambiare.

Fusi orari

A proposito, i fusi orari sono un vero casino. E se pensi che ci siano 24 fusi orari, ti sbagli di grosso.

Ad esempio, l'ora in India differisce da Greenwich Mean Time di cinque ore e mezza: GMT+5:30. Alcuni paesi passano all'ora legale e altri no. Inoltre, diversi paesi passano all'ora legale in diversi periodi dell'anno.

E alcuni paesi approvano leggi che annullano l'ora legale, o la reintroducono o la annullano di nuovo.

In ogni caso, il mondo ha fusi orari, e all'interno di ogni fuso orario c'è un tempo. Il tempo in diverse zone può coincidere durante determinati periodi dell'anno e quindi differire durante altri periodi. I fusi orari prendono solitamente il nome dalle principali città che si trovano in essi: Europe/Monaco, Asia/Singapore, ma ci sono anche eccezioni - US/Pacific.

Ufficialmente, al momento ci sono 599 fusi orari. Pensaci: 599. È tutt'altro che 24. Benvenuto nel mondo globale.

La ZoneIdclasse del java.timepacchetto viene utilizzata per memorizzare un fuso orario in Java.

A proposito, ha un getAvailableZoneIds()metodo statico, che restituisce l'insieme di tutti i fusi orari attualmente conosciuti. Per ottenere un elenco di tutte le zone, è necessario scrivere il seguente codice:

Codice Uscita console (parziale)
for (String s: ZoneId.getAvailableZoneIds())
   System.out.println(s);
Asia/Aden
America/Cuiaba
Etc/GMT+9
Etc/GMT+8

Per ottenere un ZoneIdoggetto con il suo nome, devi usare il of()metodo statico;

Codice Nota
ZoneId zone = ZoneId.of("Africa/Cairo");
Cairo


2. Creazione di un ZonedDateTimeoggetto

Quando crei un ZonedDateTimeoggetto, devi chiamare il now()metodo statico della classe e passargli un ZoneIdoggetto.

Codice Uscita console
ZoneId zone = ZoneId.of("Africa/Cairo");
ZonedDateTime time = ZonedDateTime.now(zone);
System.out.println(time);


2019-02-22T11:37:58.074816+02:00[Africa/Cairo]

Se non si passa un ZoneIdoggetto al now()metodo (e ciò è consentito), il fuso orario viene determinato automaticamente in base alle impostazioni del computer che esegue il programma.

Esempio:

Codice Uscita console
ZonedDateTime time = ZonedDateTime.now();
System.out.println(time);

2019-02-22T13:39:05.70842+02:00[Europe/Helsinki]

Conversione di una data globale in una locale

Una delle caratteristiche interessanti di ZonedDateTimeè la sua capacità di convertire in data e ora locali. Esempio:

ZoneId zone = ZoneId.of("Africa/Cairo");
ZonedDateTime cairoTime = ZonedDateTime.now(zone);

LocalDate localDate = cairoTime.toLocalDate();
LocalTime localTime = cairoTime.toLocalTime();
LocalDateTime localDateTime = cairoTime.toLocalDateTime();

3. Lavorare con il tempo

Come la LocalDateTimeclasse, la ZonedDateTimeclasse ha molti modi per ottenere singoli elementi di data e ora. Ecco un elenco di questi metodi:

int getYear()
Restituisce l'anno di una data specifica
Month getMonth()
Restituisce il mese della data: una delle numerose costanti —JANUARY, FEBRUARY, ...;
int getMonthValue()
Restituisce l'indice del mese della data. Gennaio == 1
int getDayOfMonth()
Restituisce l'indice del giorno del mese
DayOfWeek getDayOfWeek()
Restituisce il giorno della settimana: una delle numerose costanti —MONDAY, TUESDAY, ...;
int getDayOfYear()
Restituisce l'indice del giorno dell'anno
int getHour()
Restituisce le ore
int getMinute()
Restituisce i minuti
int getSecond()
Restituisce i secondi
int getNano()
Restituisce i nanosecondi

Tutti i metodi sono perfettamente analoghi ai metodi della LocalDateTimeclasse. E, naturalmente, la ZonedDateTimeclasse ha metodi che ti permettono di lavorare con date e orari. Detto questo, l'oggetto su cui vengono chiamati i metodi non cambia. Invece, restituiscono un nuovo ZonedDateTimeoggetto:

Metodi Descrizione
plusYears(int)
Aggiunge anni alla data
plusMonths(int)
Aggiunge mesi alla data
plusDays(int)
Aggiunge giorni alla data
plusHours(int)
Aggiunge ore
plusMinutes(int)
Aggiunge minuti
plusSeconds(int)
Aggiunge secondi
plusNanos(int)
Aggiunge nanosecondi
minusYears(int)
Sottrae anni dalla data
minusMonths(int)
Sottrae i mesi dalla data
minusDays(int)
Sottrae i giorni dalla data
minusHours(int)
Sottrae ore
minusMinutes(int)
Sottrae minuti
minusSeconds(int)
Sottrae i secondi
minusNanos(int)
Sottrae i nanosecondi

Non forniremo alcun esempio, poiché riteniamo che qui sia tutto chiaro per analogia con le classi appena considerate.