IT rekvalifikácia. Seniorní programátori zarábajú až 6 000 €/mesiac a rekvalifikácia je prvým krokom. Zisti, ako na to!

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íčka java.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 s ňou tu nebudeme vôbec zaoberať. Ak ju niekde stretnete, bude vám musieť stačiť oficiálna dokumentácia.
  • Calendar - Trieda Calendar je prvou náhradou pôvodnej triedy Date a novo 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 triede Calendar je immutable (to zjednodušene znamená, že s ňou možno pracovať pomocou vlákien, 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 trieda Date API Javy 8 sa touto knižnicou silne inšpiruje a vychádza z rovnakých konceptov. Knižnica Joda-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 triedy LocalDateTime 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ý chlieb 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á viac preťaženia, napr. môžeme a nemusíme zadať sekundy, mesiac môžeme zadať ako číslom, tak pomocou tzv. výpočtové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 uží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 ňu 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ódy ofPattern().
  • 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 uží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 odovzdalo ako d.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 ako piatok, 6. prosince 2016, pre čas nemá význam a pri použití vyvolá výnimku.
  • LONG - Vracia dátum ako 6. prosince 2016, pre čas nemá význam a pri použití vyvolá výnimku.
  • MEDIUM - Vracia dátum ako 6. pros 2016, čas ako 3:15:10.
  • SHORT - Vracia dátum ako 6.12.2016, čas ako 3: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.


 

Predchádzajúci článok
Riešené úlohy k 11. lekcii OOP v Jave
Všetky články v sekcii
Objektovo orientované programovanie v Jave
Preskočiť článok
(neodporúčame)
Dátum a čas od Javy 8 - Úprava a intervaly
Článok pre vás napísal David Hartinger
Avatar
Užívateľské hodnotenie:
14 hlasov
David je zakladatelem ITnetwork a programování se profesionálně věnuje 15 let. Má rád Nirvanu, nemovitosti a svobodu podnikání.
Unicorn university David sa informačné technológie naučil na Unicorn University - prestížnej súkromnej vysokej škole IT a ekonómie.
Aktivity