12. diel - Dátum a čas v Jave 8 - Vytváranie a formátovanie
V predchádzajúcom cvičení, Riešené úlohy k 11. lekcii OOP v Jave, sme si precvičili získané skúsenosti z predchádzajúcich lekcií.
V dnešnom tutoriále sa pustíme do ďalších tried, ktoré Java poskytuje. Ukážeme si, ako sa od Javy 8 pracuje s dátumom a časom.
Dátum a čas v Jave
Implementácia dátumu a času sa v Jave bohužiaľ v minulosti hneď niekoľkokrát radikálne zmenila a keďže predošlé pokusy o ňu neboli príliš uspokojivé, rozšírili sa dokonca aj externé knižnice, ktoré ju nahrádzajú. Hoci vy budete používať tú najnovšiu, ktorú Java predstavila vo verzii 8, určite sa časom v starších projektoch stretnete s legacy triedami, ktoré sa na tento účel využívali v minulosti. Sú to:
- Date - Trieda
Date
z balíčkajava.util
bola prvým pokusom o uloženie dátumu a času v Jave a nachádza sa v nej už len z dôvodu spätnej kompatibility. Takmer všetky jej metódy sú označené ako zastarané a preto sa ňou nebudeme vôbec zaoberať. Ak sa s ňou niekde stretnete, bude vám musieť stačiť oficiálna dokumentácia. - Calendar - Trieda
Calendar
je prvou náhradou pôvodnej triedyDate
a priniesla napr. lokalizáciu a pohodlnejšiu manipuláciu s vnútornou hodnotou, mohli sme jednoducho pripočítať časové intervaly a podobne. V nových projektoch ju nepoužívajte, ale pravdepodobne na ňu skôr či neskôr narazíte a v tej chvíli sa vám bude hodiť lekcia Dátum a čas v Jave pomocou triedy Calendar. - LocalDate, LocalTime a
LocalDateTime - Od Javy 8 sa objavila trieda
LocalDateTime
a jej varianty len pre samotný dátum a samotný čas. Oproti triedeCalendar
jeimmutable
(to zjednodušene znamená, že s ňou možno pracovať pomocou vláken, viac ďalej v seriáli) a ctí tzv. fluent interface (niekedy prekladané do slovenčiny ako plynulé/tečúce rozhranie), ale hovorme mu skôr reťazenie metód. Tiež nemieša získavanie a nastavovanie hodnôt v jednej metóde, ale poskytuje na tento účel oddelené metódy. Pôvodný kalendár kvalitatívne prevyšuje a nahrádza. - Joda-Time - Už spomínané neúspešné pokusy o
implementáciu dátumu a času do Javy samozrejme spôsobili potrebu kvalitnej
náhrady a ako častá alternatíva sa uchytila knižnica
Joda-Time
. Nedá sa nevšimnúť, že triedaDate
API Javy 8 sa touto knižnicou silne inšpiruje a vychádza z rovnakých konceptov. KnižnicaJoda-Time
je dosť možno ešte o niečo kvalitnejšia, ale odporúčal by som držať sa skôr už pomerne kvalitnej štandardnej triedyLocalDateTime
a vyhnúť sa zbytočným závislostiam na knižniciach tretích strán.
Veľké množstvo tried je, či chceme alebo nie, každodenným chlebom Java programátora. Berme to však z tej pozitívnej stránky, hlavne preto je táto práca asi najlepšie platená zo všetkých programovacích jazykov. Čakajú nás celkom 3 lekcie na túto tému. Tak hor sa do toho!
Triedy
LocalDateTime
, LocalDate
a LocalTime
Už vieme, že budeme používať triedy LocalDateTime
,
LocalDate
a LocalTime
a to podľa toho, či
potrebujeme ukladať dátum aj čas (napr. odlet lietadla), iba dátum (napr.
dátum narodenia) a iba čas (napr. 12:00, presnosť na nanosekundy).
Vytvorenie inštancií
Začnime tým, ako je možné inštancie jednotlivých tried vytvoriť.
Vytvoríme si nový projekt s názvom DateAndTime
.
Vytvorenie podľa zadania
Keď chceme vytvoriť novú inštanciu nejakej z tried, zavoláme na triede
továrenskú metódu of()
a zadáme patričné
parametre:
// Date and time LocalDateTime dateTime = LocalDateTime.of(2016, Month.APRIL, 15, 3, 15); System.out.println(dateTime); // Date only LocalDate date = LocalDate.of(2016, Month.APRIL, 15); System.out.println(date); // Time only LocalTime time = LocalTime.of(3, 15, 10); System.out.println(time);
Metóda má viacero preťažení, napr. môžeme a nemusíme zadať sekundy, mesiac môžeme zadať číslom alebo pomocou tzv. vymenovaného typu (čo je asi prehľadnejšie, viac sa o nich dozvieme ďalej v seriáli) a podobne.
Nezabudnime jednotlivé triedy naimportovať:
import java.time.LocalDate; import java.time.LocalDateTime; import java.time.LocalTime; import java.time.Month;
Výstup:
Konzolová aplikácia
2016-04-15T03:15
2016-04-15
03:15:10
Vytvorenie podľa aktuálneho dátumu a času
Vo svojich aplikáciách budeme samozrejme potrebovať získať aj aktuálny
dátum a čas. Na to slúži ďalšia továrenská metóda now()
,
ktorú voláme opäť priamo na príslušnej triede:
// Current date and time LocalDateTime dateTime = LocalDateTime.now(); System.out.println(dateTime); // Curent date LocalDate date = LocalDate.now(); System.out.println(date); // Current time LocalTime time = LocalTime.now(); System.out.println(time);
Formátovanie
Keďže výstup nie je úplne používateľsky prívetivý, poďme si
ukázať, ako ho naformátovať. Asi vás neprekvapí, že na to použijeme
metódu format()
už normálne na inštancii. Samotné
formátovanie zaisťuje trieda DateTimeFormatter
, nás na nej budú
zaujímať tieto statické metódy:
ofLocalizedDateTime()
- Sformátuje na lokálny formát dátumu a času. Zadávame dva parametre - štýl dátumu a štýl času. Máme na výber plný (full
) až krátky (short
) formát, čo platí pri všetkých formátovacích metódach okrem metódyofPattern()
.ofLocalizedDate()
- Sformátuje na lokálny formát dátumu.ofLocalizedTime()
- Sformátuje na lokálny formát času.ofPattern()
- Oproti metódam vyššie, ktoré formátovali podľa regionálneho nastavenia daného používateľa, tu môžeme špecifikovať vlastný formát pomocou textového reťazca a zástupných znakov. Napr. deň, mesiac, rok, hodiny, minúty a sekundy (všetky čísla) by sa odovzdali akod.M.y H:m:ss
. Popis významu všetkých symbolov by bol zbytočne vyčerpávajúci a nájdete ho v oficiálnej dokumentácii Javy.
Urobme si príklad:
LocalDateTime dateTime = LocalDateTime.now();
System.out.println(dateTime.format(DateTimeFormatter.ofLocalizedTime(FormatStyle.MEDIUM)));
System.out.println(dateTime.format(DateTimeFormatter.ofLocalizedDate(FormatStyle.FULL)));
System.out.println(dateTime.format(DateTimeFormatter.ofLocalizedDateTime(FormatStyle.LONG, FormatStyle.SHORT)));
System.out.println(dateTime.format(DateTimeFormatter.ofPattern("d.M.y H:m:ss")));
Nezabudnime si dodať importy:
import java.time.format.DateTimeFormatter; import java.time.format.FormatStyle;
Výstupom je aktuálny formátovaný čas:
Konzolová aplikácia
20:13:04
piatok, 9. decembra 2016
9. decembra 2016 20:13
9.12.2016 20:13:04
Všimnite si, že metódam špecifikujeme v parametroch aj už spomínaný
štýl (enum FormatStyle
), ktorý udáva, či chceme výpis
stručný až vyčerpávajúci (ukecaný). Máme k dispozícii tieto
hodnoty:
FULL
- Vracia dátum akopiatok, 6. decembra 2016
, pre čas nemá význam a pri použití vyvolá výnimku.LONG
- Vracia dátum ako6. decembra 2016
, pre čas nemá význam a pri použití vyvolá výnimku.MEDIUM
- Vracia dátum ako6. dec 2016
, čas ako3:15:10
.SHORT
- Vracia dátum ako6.12.2016
, čas ako3:15
.
Na triede DateTimeFormatter
sú tiež dostupné preddefinované
formáty ako konštanty, ale slovenské formáty tam bohužiaľ nenájdeme.
V ďalšej lekcii, Dátum a čas od Javy 8 - Úprava a intervaly, si ukážeme prevody medzi LocalDate
,
LocalTime
a LocalDateTime
, ako upravovať vnútornú
hodnotu a prácu s intervalmi.