1. A Date Time API bemutatása

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 |
|---|---|
|
|
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 |
|---|---|
|
|
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 |
|---|---|
|
|
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 |
|---|---|
|
|
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 |
|---|---|
|
|
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 |
|---|---|
|
Egy adott dátum évét adja vissza |
|
A dátum hónapját adja vissza: egy a számos állandó közülJANUARY, FEBRUARY, ...; |
|
A dátum hónapjának indexét adja vissza. január == 1. |
|
A hónap napjának indexét adja vissza |
|
Az év eleji napi indexet adja vissza |
|
A hét napját adja vissza: egy a számos állandó közülMONDAY, TUESDAY, ...; |
|
Visszaadja a korszakot: vagy BCE(a jelenlegi korszak előtt) és CE(jelenlegi korszak) |
Példa:
| Kód | Konzol kimenet |
|---|---|
|
|
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 |
|---|---|
|
Adott számú napot ad a dátumhoz |
|
Heteket ad a dátumhoz |
|
Hónapokat ad a dátumhoz |
|
Éveket ad a dátumhoz |
|
A napokat levonja a dátumból |
|
A dátumból levonja a heteket |
|
A hónapokat levonja a dátumból |
|
Az éveket levonja a dátumból |
Példa:
| Kód | Konzol kimenet |
|---|---|
|
|
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.
GO TO FULL VERSION