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 Calendar
megjelené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.time
csomag 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.format
csomag 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ú DateTimeFormatter
osztályt, amely helyettesíti az SimpleDateFormat
osztályt.
A java.time.zone
csomag 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. LocalDate
osztály
A Date Time API első és leghasznosabb osztálya, amelyet megvizsgálunk, az az LocalDate
osztá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 LocalDate
osztá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 LocalDate
a 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 today
egy LocalDate
vá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 LocalDate
osztá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 ZoneId
osztályra (java.time.ZoneId). Van egy of()
metódusa, amely egy ZoneId
objektumot 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 LocalDate
kell használnia . of()
Itt is minden nagyon egyszerű és világos:
LocalDate date = LocalDate.of(2019, Month.FEBRUARY, 22);
Ahol date
egy LocalDate
változó, és az osztály statikus metódusának hívása .LocalDate.of()
of()
LocalDate
Itt azt látjuk, hogy FEBRUARY
az 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 ofYearDay
mó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 year
van az év száma és day
a nap indexe az évben.
Példa:
Kód | Konzol kimenet |
---|---|
|
|
2019 100. napja április 10.
Unix randevú
Emlékszel arra, hogy Date
az 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 LocalDate
osztá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 day
van 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. LocalDate
Az 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 LocalDate
objektumban
Az LocalDate
osztá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ő LocalDate
objektumot, hanem egy újat adnak vissza a kívánt adatokkal.
Íme az LocalDate
osztá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.