1. ZonedDateTimeosztály

Van egy másik nagyon érdekes osztály a Date Time API-ban: az ZonedDateTimeosztály. Fő célja, hogy kényelmessé tegye a különböző időzónákban lévő dátumokkal való munkavégzést.

LocalDatekiválóan alkalmas dátumok ábrázolására. Például születésnapok. A születésnapom március 15-én van, függetlenül attól, hogy hol vagyok. Ez egy példa a dátumra.

LocalTimenagyszerű az idő leírására, mint az ébresztőórán beállított idő: 5:00-ra állítom az ébresztőt, és nem számít, hol vagyok. 5:00 az 5:00 óra. Ez egy példa az idővel való munkára.

Tegyük fel, hogy írunk egy alkalmazást, amely repülőjegyeket foglal le. A repülők a helyi idő szerint szállnak fel és érkeznek. A gép meghatározott ideig a levegőben van, de az időzónák változhatnak.

Időzónák

Az időzónák egyébként igazi káosz. És ha azt gondolja, hogy 24 időzóna létezik, akkor nagyot téved.

Például az indiai idő öt és fél órával különbözik a greenwichi középidőtől: GMT+5:30. Egyes országok átállnak a nyári időszámításra, mások pedig nem. Sőt, a különböző országok az év különböző szakaszaiban átállnak a nyári időszámításra.

Egyes országok pedig olyan törvényeket fogadnak el, amelyek eltörlik a nyári időszámítást, vagy újra bevezetik, vagy újra eltörlik.

Mindenesetre a világnak vannak időzónái, és minden időzónán belül egy idő van. A különböző zónákban az év bizonyos időszakaiban az idő egybeeshet, majd más időszakokban eltérhet. Az időzónákat általában a bennük található nagyobb városokról nevezik el: Europe/Monaco, Asia/Singapore, de vannak kivételek is — US/Pacific.

Hivatalosan jelenleg 599 időzóna létezik. Gondolj bele: 599. Ez messze nem 24. Üdvözöljük a globális világban.

A csomagból ZoneIdszármazó osztály java.timeegy időzóna tárolására szolgál Java nyelven.

Egyébként van egy statikus getAvailableZoneIds()metódusa, ami visszaadja az összes jelenleg ismert időzóna halmazát. Az összes zóna listájának megtekintéséhez meg kell írnia a következő kódot:

Kód Konzol kimenet (részleges)
for (String s: ZoneId.getAvailableZoneIds())
   System.out.println(s);
Asia/Aden
America/Cuiaba
Etc/GMT+9
Etc/GMT+8

Ahhoz, hogy egy objektumot a neve alapján kapjon , a statikus módszert ZoneIdkell használnia ;of()

Kód jegyzet
ZoneId zone = ZoneId.of("Africa/Cairo");
Cairo


2. ZonedDateTimeObjektum létrehozása

Objektum létrehozásakor ZonedDateTimemeg kell hívni az osztály statikus now()metódusát, és át kell adni ZoneIdneki egy objektumot.

Kód Konzol kimenet
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]

Ha nem ad át ZoneIdobjektumot a metódusnak now()(és ez megengedett), akkor az időzóna automatikusan kerül meghatározásra a programot futtató számítógép beállításai alapján.

Példa:

Kód Konzol kimenet
ZonedDateTime time = ZonedDateTime.now();
System.out.println(time);

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

Globális dátum konvertálása helyi dátummá

Az egyik érdekes tulajdonsága, ZonedDateTimehogy képes helyi dátumra és időre konvertálni. Példa:

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

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

3. Munka az idővel

LocalDateTimeAz osztályhoz hasonlóan az ZonedDateTimeosztálynak is számos módja van a dátum és idő egyes elemeinek lekérésére. Íme a módszerek listája:

int getYear()
Egy adott dátum évét adja vissza
Month getMonth()
A dátum hónapját adja vissza: egy a több állandó közül –JANUARY, FEBRUARY, ...;
int getMonthValue()
A dátum hónapjának indexét adja vissza. január == 1
int getDayOfMonth()
A hónap napjának indexét adja vissza
DayOfWeek getDayOfWeek()
A hét napját adja vissza: egy a számos állandó közül –MONDAY, TUESDAY, ...;
int getDayOfYear()
Az év napjának indexét adja vissza
int getHour()
Az órákat adja vissza
int getMinute()
Visszaadja a jegyzőkönyvet
int getSecond()
Visszaadja a másodperceket
int getNano()
A nanoszekundumokat adja vissza

Az összes metódus tökéletesen analóg az osztály metódusaival LocalDateTime. És természetesen az ZonedDateTimeosztálynak vannak olyan metódusai, amelyek lehetővé teszik a dátumok és időpontok kezelését. Ennek ellenére az objektum, amelyen a metódusokat meghívja, nem változik. Ehelyett egy új ZonedDateTimeobjektumot adnak vissza:

Mód Leírás
plusYears(int)
Éveket ad a dátumhoz
plusMonths(int)
Hónapokat ad a dátumhoz
plusDays(int)
Napokat ad a dátumhoz
plusHours(int)
Órák hozzáadása
plusMinutes(int)
Perceket ad hozzá
plusSeconds(int)
Másodperceket ad hozzá
plusNanos(int)
Nanoszekundumokat ad hozzá
minusYears(int)
Az éveket levonja a dátumból
minusMonths(int)
A hónapokat levonja a dátumból
minusDays(int)
A napokat levonja a dátumból
minusHours(int)
Kivonja az órákat
minusMinutes(int)
Kivonja a perceket
minusSeconds(int)
Kivonja a másodperceket
minusNanos(int)
Kivonja a nanoszekundumot

Példákat nem mondunk, mivel úgy gondoljuk, hogy itt minden világos az imént vizsgált osztályokhoz hasonlóan.