1. ZonedDateTimeclasa

Există o altă clasă foarte interesantă în API-ul Date Time: ZonedDateTimeclasa. Scopul său principal este de a facilita lucrul cu date în diferite fusuri orare.

LocalDateeste excelent pentru a reprezenta datele. De exemplu, zilele de naștere. Ziua mea de naștere este 15 martie, indiferent unde mă aflu. Acesta este un exemplu de întâlnire.

LocalTimeeste grozav să descrii timpul, ca și ora setată pe un ceas cu alarmă: am setat alarma pentru ora 5:00 și nu contează unde mă aflu. 5:00 este 5:00. Acesta este un exemplu de lucru cu timpul.

Acum să presupunem că scriem o aplicație care rezervă zboruri. Avioanele decolează și sosesc în funcție de ora locală. Avionul este în aer pentru o oră fixă, dar fusurile orare se pot schimba.

Fusuri orare

Apropo, fusurile orare sunt o adevărată mizerie. Și dacă crezi că există 24 de fusuri orare, te înșeli foarte mult.

De exemplu, ora din India diferă de Greenwich Mean Time cu cinci ore și jumătate: GMT+5:30. Unele țări trec la ora de vară, iar altele nu. În plus, diferite țări trec la ora de vară în diferite perioade ale anului.

Și unele țări adoptă legi care anulează ora de vară sau o reintroduc sau o anulează din nou.

În orice caz, lumea are fusuri orare, iar în fiecare fus orar există o singură oră. Ora din diferite zone poate coincide în anumite perioade ale anului și apoi poate diferi în alte perioade. Fusurile orare sunt de obicei denumite după marile orașe situate în ele: Europe/Monaco, Asia/Singapore, dar există și excepții — US/Pacific.

Oficial, există 599 de fusuri orare în acest moment. Gândește-te: 599. Este departe de 24. Bun venit în lumea globală.

Clasa ZoneIddin java.timepachet este folosită pentru a stoca un fus orar în Java.

Apropo, are o getAvailableZoneIds()metodă statică, care returnează setul tuturor fusurilor orare cunoscute în prezent. Pentru a obține o listă a tuturor zonelor, trebuie să scrieți următorul cod:

Cod Ieșire din consolă (parțială)
for (String s: ZoneId.getAvailableZoneIds())
   System.out.println(s);
Asia/Aden
America/Cuiaba
Etc/GMT+9
Etc/GMT+8

Pentru a obține un ZoneIdobiect după numele său, trebuie să utilizați of()metoda statică;

Cod Notă
ZoneId zone = ZoneId.of("Africa/Cairo");
Cairo


2. Crearea unui ZonedDateTimeobiect

Când creați un ZonedDateTimeobiect, trebuie să apelați now()metoda statică a clasei și să ZoneIdîi transmiteți un obiect.

Cod Ieșire de consolă
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]

Dacă nu treceți un ZoneIdobiect metodei now()(și acest lucru este permis), atunci fusul orar este determinat automat pe baza setărilor computerului care rulează programul.

Exemplu:

Cod Ieșire de consolă
ZonedDateTime time = ZonedDateTime.now();
System.out.println(time);

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

Transformarea unei date globale într-una locală

Una dintre caracteristicile interesante ale ZonedDateTimeeste capacitatea sa de a converti la o dată și oră locală. Exemplu:

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

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

3. Lucrul cu timpul

La fel ca și LocalDateTimeclasa, ZonedDateTimeclasa are o mulțime de moduri de a obține elemente individuale ale unei date și ale unei ore. Iată o listă a acestor metode:

int getYear()
Returnează anul unei anumite date
Month getMonth()
Returnează luna datei: una dintre mai multe constante —JANUARY, FEBRUARY, ...;
int getMonthValue()
Returnează indexul lunii datei. ianuarie == 1
int getDayOfMonth()
Returnează indexul zilei lunii
DayOfWeek getDayOfWeek()
Returnează ziua săptămânii: una dintre mai multe constante —MONDAY, TUESDAY, ...;
int getDayOfYear()
Returnează indexul zilei din an
int getHour()
Returnează orele
int getMinute()
Returnează minutele
int getSecond()
Returnează secundele
int getNano()
Returnează nanosecundele

Toate metodele sunt perfect analoge cu metodele clasei LocalDateTime. Și, desigur, ZonedDateTimeclasa are metode care vă permit să lucrați cu date și ore. Acestea fiind spuse, obiectul pe care sunt apelate metodele nu se schimbă. În schimb, returnează un nou ZonedDateTimeobiect:

Metode Descriere
plusYears(int)
Adaugă ani la dată
plusMonths(int)
Adaugă luni la dată
plusDays(int)
Adaugă zile la dată
plusHours(int)
Adaugă ore
plusMinutes(int)
Adaugă minute
plusSeconds(int)
Adaugă secunde
plusNanos(int)
Adaugă nanosecunde
minusYears(int)
Scade ani de la data
minusMonths(int)
Scăde luni de la dată
minusDays(int)
Scade zile de la dată
minusHours(int)
Scade ore
minusMinutes(int)
Scade minute
minusSeconds(int)
Scade secunde
minusNanos(int)
Scade nanosecunde

Nu vom oferi niciun exemplu, deoarece credem că totul aici este clar prin analogie cu clasele pe care tocmai le-am luat în considerare.