Dátum a čas v Jave pomocou triedy Calendar
V predchádzajúcom kvíze, Kvíz - Objektovo orientované programovanie v Jave, sme si overili nadobudnuté skúsenosti z kurzu.
Upozornenie: Tento článok je na sieti umiestnený iba na účely pochopenia starších aplikácií. Od Javy 8 je k dispozícii nové API pre prácu s časom. Viac sa o ňom dočítate v článku Dátum a čas v Jave 8.
Calendar
S dátumom a časom sa v Jave predtým pracovalo pomocou triedy Date. Tá však bola označená za zastaranú a teraz sa využíva trieda Calendar. Pokiaľ sa v nejakých meteriáloch stretnete s triedou Date, nepoužívajte ju. Názov môže Calendar môže byť trochu mätúce, jedná sa v podstate o kalendár v pamäti počítača, ktorý si nastavíme na určitý dátum a čas. Týmto spôsobom sa v Jave dátum a čas ukladá. kalendár vždy obsahuje aj čas, ten môžeme a nemusíme používať (napr. ho nebudeme ani zadávať ani vypisovať, ale fyzicky tam bude prítomný).
Vytvorenie inštancie s aktuálnym dátumom a časom
Začnime tým, ako je možné inštanciu Calendar vytvoriť. Vytvoríme si projekt s názvom DatumACas. Do balíčka si pridáme import java.util.Calendar. V Jave je to s dátumom a časom trochu zamotané. Keď chceme vytvoriť novú inštanciu kalendára, zavoláme na triede Calendar statickú metódu getInstance():
Teraz naša premenná kalendar obsahuje kalendár, nastavený na aktuálny dátum a čas. Poďme si ho vypísať. Ak napíšeme:
Vypíše sa iba škaredá textová reprezentácia objektu. Akonáhle chceme inštanciu Calendar vypisovať, potrebujeme na to tzv. formatter. Pridáme import java.text.SimpleDateFormat a po vytvorení kalendára vytvoríme formatter s nasledujúcim formátom:
A vypíšeme:
Výsledok:
Úprava hodnoty
K existujúcemu kalendáru môžeme pripočítať určitý počet dní, hodín a podobne. Slúži na to metóda add(), ktorá berie ako 1. parameter konštantu políčka kalendára a ako druhý počet jednotiek, ktoré chceme pridať. Konštanty nájdeme na triede Calendar, označujú čo chceme pridávať.
Skúsme si to a pridajme nášmu kalendáru 3 dni v týždni:
Výsledok:
Ak by sme zadali zápornú hodnotu, dni by sme ubrali. V prvom parametri metódy môžete použiť mnoho konštánt, budú to najmä:
- DAY_OF_MONTH - Deň v mesiaci
- HOUR_OF_DAY - Hodina
- MILLISECOND - Milisekunda
- MINUTE - Minúta
- MONTH - Mesiac
- YEAR - Rok
Hodnotu kalendára môžeme jednoducho nastaviť pomocou metódy set(). Má rovnaké parametre ako metóda add(), len hodnoty nastavuje namiesto toho, aby ich pripočítala k existujúcim. Skúsme si nastaviť kalendár na programátorské vianoce, teda na Halloween (áno, pretože 31 OCT = 25 DEC).
Výsledok:
Môže byť mätúce, že mesiace začínajú od nuly. Január je teda nultý a október je deviaty! Pre istotu môžeme pri nastavovaní hodnoty použiť konštantu OCTOBER (október):
Čítanie hodnoty
Na čítanie určitej hodnoty slúžia opäť konštanty, NetBeans vám ich v ponuke ponúkne naozaj veľa. Čítanie prebieha metódou get(), ktorá opäť berie v parametri konštantu políčka. Ku konštantám, čo som spomenul vyššie, môžeme pridať ešte:
- DAY_OF_WEEK - Vráti deň v týždni
- WEEK_OF_YEAR - Týždeň v roku. Môžeme tak napr. zistiť, či je párny alebo nepárny týždeň.
- HOUR - Hodina vo formáte 1-12. Či je 0 popoludní alebo poludnie označuje hodnota konštanty AM_PM.
- AM_PM - Ak je tu hodnota AM, hodnota v HOUR znamená pred poludním. Hodnota PM označuje popoludní.
Výstup:
Parsovanie dátumu a času
Asi sa nám bude často stávať, že budeme chcieť po užívateľovi zadať nejaký dátum, prípadne aj čas. Formatter data nám na tieto účely ponúka metódu parse(). Nechajme užívateľa zadať dátum v textovej podobe a potom ho preveďme do objektu Calendar a vypíšme.
Výsledok:
Parsovanie musíme obaliť blokom try a pridať blok catch, NetBeans nám túto úpravu ponúkne a urobí ju za nás. K výnimkám (try a catch) sa v seriáli dostaneme neskôr. Parsovanie musí byť v try bloku z toho dôvodu, že používateľ môže zadať nesprávny formát. Parsovanie sa potom nepodarí a program pokračuje v bloku catch, kde na chybu zareagujeme.
Bude potrebné pridať importy java.text.ParseException a niekoľko ďalších k loggeru, NetBeans by to mal urobiť za vás alebo použite Fix Imports.
Tabuľka jednotlivých znakov, ktoré v reťazci formatteru môžeme použiť a ich význam je trochu vyčerpávajúci, záujemca odkážem na oficiálnu dokumentáciu, kde sú vysvetlené jednotlivé zložky patternu: http://docs.oracle.com/…eFormat.html
Jednotlivé kalendáre môžeme porovnávať pomocou metódy compareTo(). Hotový projekt so všetkým, čo sme v článku robili, nájdete ako vždy v prílohe.
Stiahnuť
Stiahnutím nasledujúceho súboru súhlasíš s licenčnými podmienkami
Stiahnuté 622x (6.33 kB)
Aplikácia je vrátane zdrojových kódov v jazyku Java