1. A Date Time API bemutatása

Bemutatkozik a Date Time API

A Java készítőinek nem tetszett a helyzet a Dátum és a Naptár osztályokkal. A maguk korában jók voltak, de az idők változnak. És valami egyszerű, erőteljes és megbízható dolog vált szükségessé. És a Java 8 kiadásával (15 évvel a Calendarmegjelenés után) bevezették a Java Date Time API-t . Ez egy olyan osztálykészlet, amelynek képesnek kell lennie minden lehetséges idővel kapcsolatos feladat megoldására.

Annyi osztály volt, hogy több csomagra osztották őket:

A java.timecsomag a Java Date Time API alapcsomagja: olyan osztályokat tartalmaz, mint a LocalDate, LocalTime, LocalDateTime, Instant, Period, és Duration. Ezen osztályok összes objektuma immutable, ami azt jelenti, hogy létrehozásuk után nem módosíthatók.

A java.time.formatcsomag osztályokat tartalmaz az idő formázásához, azaz az időpontok (és dátumok) karakterláncokká konvertálásához és fordítva. Például tartalmazza a sokoldalú DateTimeFormatterosztályt, amely helyettesíti az SimpleDateFormatosztályt.

A java.time.zonecsomag osztályokat tartalmaz az időzónákkal való munkavégzéshez. Olyan osztályokat tartalmaz, mint TimeZoneés ZonedDateTime. Ha szerverkódot ír a világ különböző részein található ügyfelek számára, akkor valóban szüksége lesz ezekre az osztályokra.


2. LocalDateosztály

A Date Time API első és leghasznosabb osztálya, amelyet megvizsgálunk, az az LocalDateosztály. Amint azt a nevéből valószínűleg kitalálhatja, ezt az osztályt úgy tervezték, hogy dátumokkal dolgozzon.

Ennek az osztálynak az objektumai a létrehozásuk után nem változnak, azaz az LocalDateosztály megváltoztathatatlan. Ez a tulajdonság azonban egyszerűbbé és megbízhatóbbá teszi az osztályt. Főleg, ha több szál (végrehajtási szál) is kölcsönhatásba lép egy ilyen objektummal egy időben.

Új objektum létrehozásához LocalDatea statikus módszerek egyikét kell használnia. Itt van a főbbek listája.

Az aktuális dátum lekérése

Az aktuális dátum lekéréséhez statikus módszert kell használnia now(). Ez sokkal könnyebb, mint amilyennek látszik:

LocalDate today = LocalDate.now();

Ahol todayegy LocalDateváltozó, és az osztály LocalDate.now()statikus metódusának hívása .now()LocalDate

Példa:

Kód Konzol kimenet
LocalDate today = LocalDate.now();
System.out.println("Today = " + today);

Today = 2019-02-22

Dátum lekérése egy adott időzónában

Az LocalDateosztálynak van egy olyan változata is now(ZoneId), amely lehetővé teszi az aktuális dátum lekérését egy adott időzónában.

Ehhez szükségünk van egy másik osztályra - az ZoneIdosztályra (java.time.ZoneId). Van egy of()metódusa, amely egy ZoneIdobjektumot ad vissza az időzóna nevével.

A Shanghai aktuális dátumának meghatározásához a következő kódot kell beírnia:

Kód Konzol kimenet
ZoneId  timezone = ZoneId.of("Asia/Shanghai");
LocalDate today = LocalDate.now(timezone);
System.out.println("In Shanghai, now = " + today);


In Shanghai, now = 2019-02-22

Az interneten megtalálja az összes időzóna nevének listáját.


3. Egy adott dátum megszerzése

Egy adott dátumot képviselő objektum lekéréséhez a statikus módszert LocalDatekell használnia . of()Itt is minden nagyon egyszerű és világos:

LocalDate date = LocalDate.of(2019, Month.FEBRUARY, 22);

Ahol dateegy LocalDateváltozó, és az osztály statikus metódusának hívása .LocalDate.of()of()LocalDate

Itt azt látjuk, hogy FEBRUARYaz osztály állandója Month(java.time.Month) februárt ad meg hónapként.

A hónapot a régi módon is megadhatja – egy szám használatával:

LocalDate date = LocalDate.of(2019, 2, 22);

Kettő? Február helyett? Ez azt jelenti, hogy a hónapokat ismét egytől számolják?

Igen, közel 20 évvel a Java létrehozása után végre megszűnt a hónapok számozása nulláról.

Példa:

Kód Konzol kimenet
LocalDate today = LocalDate.of(2019, 2, 22);
System.out.println("Today = " + today);

Today = 2019-02-22

Dátum beszerzése a nap indexe alapján

Van még egy érdekes módja a dátum létrehozásának: a ofYearDaymódszerrel csak az évszám és az év napjának indexe alapján kaphat dátumot. Íme az általános megjelenés:

LocalDate date = LocalDate.ofYearDay(year, day);

Hol yearvan az év száma és daya nap indexe az évben.

Példa:

Kód Konzol kimenet
LocalDate today = LocalDate.ofYearDay(2019, 100);
System.out.println("Today = " + today);

Today = 2019-04-10

2019 100. napja április 10.

Unix randevú

Emlékszel arra, hogy Dateaz objektumok az időt mindig ezredmásodpercek számában tárolták 1970. január 1-je óta? Hogy a programozók ne hagyják ki a régi szép időket, az LocalDateosztály kapott egy ofEpochDay()metódust, amely az 1970. január 1-jétől számított dátumot adja vissza. Íme az általános megjelenés:

LocalDate date = LocalDate.ofEpochDay(day);

Hol dayvan az 1970. január 1-je óta eltelt napok száma?

Példa:

Kód Konzol kimenet
LocalDate today = LocalDate.ofEpochDay(1);
System.out.println("Today = " + today);

Today = 1970-01-02

4. Egy randevú elemeinek megszerzése

Az objektumok megváltoztatása lehetetlen LocalDate, de a tárolt dátum egyes elemei beszerezhetők. LocalDateAz objektumok többféle módszerrel rendelkeznek erre:

Módszer Leírás
int getYear()
Egy adott dátum évét adja vissza
Month getMonth()
A dátum hónapját adja vissza: egy a számos á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
int getDayOfYear()
Az év eleji napi indexet adja vissza
DayOfWeek getDayOfWeek()
A hét napját adja vissza: egy a számos állandó közül
MONDAY, TUESDAY, ...;
IsoEra getEra()
Visszaadja a korszakot: vagy BCE(a jelenlegi korszak előtt) és CE(jelenlegi korszak)

Példa:

Kód Konzol kimenet
LocalDate today = LocalDate.now();
System.out.println(today.getYear());
System.out.println(today.getMonth());
System.out.println(today.getMonthValue());
System.out.println(today.getDayOfMonth());
System.out.println(today.getDayOfWeek());

2019
FEBRUARY
2
22
FRIDAY

5. Dátum módosítása egy LocalDateobjektumban

Az LocalDateosztály számos metódust tartalmaz, amelyek lehetővé teszik a dátumokkal való munkát. Ezeknek a metódusoknak a megvalósítása analóg az osztály metódusaival String: nem változtatják meg a meglévő LocalDateobjektumot, hanem egy újat adnak vissza a kívánt adatokkal.

Íme az LocalDateosztály metódusai:

Módszer Leírás
plusDays(int days)
Adott számú napot ad a dátumhoz
plusWeeks(int weeks)
Heteket ad a dátumhoz
plusMonths(int months)
Hónapokat ad a dátumhoz
plusYears(int years)
Éveket ad a dátumhoz
minusDays(int days)
A napokat levonja a dátumból
minusWeeks(int weeks)
A dátumból levonja a heteket
minusMonths(int months)
A hónapokat levonja a dátumból
minusYears(int years)
Az éveket levonja a dátumból

Példa:

Kód Konzol kimenet
LocalDate birthday = LocalDate.of(2019, 2, 28);
LocalDate nextBirthday = birthday.plusYears(1);
LocalDate firstBirthday = birthday.minusYears(30);

System.out.println(birthday);
System.out.println(nextBirthday);
System.out.println(firstBirthday);




2019-02-28
2020-02-28
1989-02-28

Az birthday object, akinek a módszereit hívjuk, nem változik. Ehelyett a metódusai új objektumokat adnak vissza, amelyek tartalmazzák a kívánt adatokat.