Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Datum a čas v Javě pomocí třídy Calendar

Upozornění: Tento článek je na síti umístěn pouze pro účely pochopení starších aplikací. Od Javy 8 je k dispozici nové API pro práci s časem. Více se o něm dočtete v článku Datum a čas v Javě 8.

Calendar

S datem a časem se v Javě dříve pracovalo pomocí třídy Date. Ta však byla označena za zastaralou a nyní se využívá třída Calendar. Pokud se v nějakých meteriálech setkáte s třídou Date, nepoužívejte ji. Název může Calendar může být poněkud matoucí, jedná se v podstatě o kalendář v paměti počítače, který si nastavíme na určitý datum a čas. Tímto způsobem se v Javě datum a čas ukládá. kalendář vždy obsahuje i čas, ten můžeme a nemusíme používat (např. ho nebudeme ani zadávat ani vypisovat, ale fyzicky tam bude přítomný).

Vytvoření instance s aktuálním datem a časem

Začněme tím, jak lze instanci Calendar vytvořit. Vytvoříme si projekt s názvem DatumACas. Do balíčku si přidáme import java.util.Calendar. V Javě je to s datem a časem trochu zamotané. Když chceme vytvořit novou instanci kalendáře, zavoláme na třídě Calendar statickou metodu getInstance():

Calendar kalendar = Calendar.getInstance();

Nyní naše proměnná kalendar obsahuje kalendář, nastavený na aktuální datum a čas. Pojďme si ho vypsat. Pokud napíšeme:

System.out.println(kalendar);

Vypíše se pouze ošklivá textová reprezentace objektu. Jakmile chceme instanci Calendar vypisovat, potřebujeme k tomu tzv. formatter. Přidáme import java.text.Sim­pleDateFormat a po vytvoření kalendáře vytvoříme formatter s následujícím formátem:

DateFormat formatData = new SimpleDateFormat("d.MMMM yyyy H:mm");

A vypíšeme:

System.out.println(formatData.format(kalendar.getTime()));

Výsledek:

Výpis aktuálního data a času v Javě - Objektově orientované programování v Javě

Úprava hodnoty

K existujícímu kalendáři můžeme přičítat určitý počet dní, hodin a podobně. Slouží k tomu metoda add(), která bere jako 1. parametr konstantu políčka kalendáře a jako druhý počet jednotek, které chceme přidat. Konstanty nalezneme na třídě Calendar, označují co chceme přidávat.

Zkusme si to a přidejme našemu kalendáři 3 dny v týdnu:

kalendar.add(Calendar.DAY_OF_MONTH, 3);

Výsledek:

4.duben 2013 18:45

Pokud bychom zadali zápornou hodnotu, dny bychom ubrali. V prvním parametru metody můžete použít mnoho konstant, budou to zejména:

  • DAY_OF_MONTH - Den v měsíci
  • HOUR_OF_DAY - Hodina
  • MILLISECOND - Milisekunda
  • MINUTE - Minuta
  • MONTH - Měsíc
  • YEAR - Rok

Nastavení hodnoty

Hodnotu kalendáře můžeme jednoduše nastavit pomocí metody set(). Má stejné parametry jako metoda add(), jen hodnoty nastavuje místo toho, aby je přičítala k existujícím. Zkusme si nastavit kalendář na programátorské vánoce, tedy na Halloween (ano, protože 31 OCT = 25 DEC).

kalendar.set(Calendar.DAY_OF_MONTH, 31);
kalendar.set(Calendar.MONTH, 9);
kalendar.set(Calendar.YEAR, 2013);

Výsledek:

31.říjen 2013 18:48

Může být matoucí, že měsíce začínají od nuly. Leden je tedy nultý a říjen je deváty! Pro jistotu můžeme při nastavování hodnoty použít konstantu OCTOBER (říjen):

kalendar.set(Calendar.MONTH, Calendar.OCTOBER);

Čtení hodnoty

Pro čtení určité hodnoty slouží opět konstanty, NetBeans vám jich v nabídce nabídne opravdu mnoho. Čtení probíhá metodou get(), která opět bere v parametru konstantu políčka. Ke konstantám, co jsem zmínil výše, můžeme přidat ještě:

  • DAY_OF_WEEK - Vrátí den v týdnu
  • WEEK_OF_YEAR - Týden v roce. Můžeme tak např. zjistit, zda je sudý nebo lichý týden.
  • HOUR - Hodina ve formátu 1-12. Jestli je 0 odpoledne nebo poledne označuje hodnota konstanty AM_PM.
  • AM_PM - Pokud je zde hodnota AM, hodnota v HOUR znamená před polednem. Hodnota PM označuje po poledni.

Zkusme si vypsat nějakou vlastnost našeho kalendáře:

System.out.printf("Hodina: %s\n", kalendar.get(Calendar.HOUR_OF_DAY));

Výstup:

Hodina: 5

Parsování data a času

Asi se nám bude často stávat, že budeme chtít po uživateli zadat nějaké datum, případně i čas. Formatter data nám k těmto účelům nabízí metodu parse(). Nechme uživatele zadat datum v textové podobě a poté ho převeďme do objektu Calendar a vypišme.

Scanner sc = new Scanner(System.in, "Windows-1250");

Calendar kalendar = Calendar.getInstance();

System.out.print("Zadej datum ve formátu 1.1.2000 13:14:");
formatData = new SimpleDateFormat("d.M.yyyy H:mm");
try {
    kalendar.setTime(formatData.parse(sc.nextLine()));
    System.out.println("Zadal jsi datum: " + formatData.format(kalendar.getTime()));
} catch (ParseException ex) {
    Logger.getLogger(DatumACas.class.getName()).log(Level.SEVERE, null, ex);
}

Výsledek:

Parsování data a času v Javě - Objektově orientované programování v Javě

Parsování musíme obalit blokem try a přidat blok catch, NetBeans nám tuto úpravu nabídne a udělá ji za nás. K výjimkám (try a catch) se v seriálu dostaneme později. Parsování musí být v try bloku z toho důvodu, že uživatel může zadat nesprávný formát. Parsování se potom nepovede a program pokračuje v bloku catch, kde na chybu zareagujeme.

Bude potřeba přidat importy java.text.Par­seException a několik dalších k loggeru, NetBeans by to měl udělat za vás nebo použijte Fix Imports.

Tabulka jednotlivých znaků, které v řetězci formatteru můžeme použít a jejich význam je poněkud vyčerpávající, zájemce odkáži na oficiální dokumentaci, kde jsou vysvětleny jednotlivé složky patternu: http://docs.oracle.com/…eFormat.html

Jednotlivé kalendáře můžeme porovnávat pomocí metody compareTo(). Hotový projekt se vším, co jsme v článku dělali, naleznete jako vždy v příloze.


 

Stáhnout

Stažením následujícího souboru souhlasíš s licenčními podmínkami

Staženo 614x (6.33 kB)
Aplikace je včetně zdrojových kódů v jazyce Java

 

Předchozí článek
Kvíz - Objektově orientované programování v Javě
Všechny články v sekci
Objektově orientované programování v Javě
Článek pro vás napsal David Hartinger
Avatar
Uživatelské hodnocení:
8 hlasů
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 se informační technologie naučil na Unicorn University - prestižní soukromé vysoké škole IT a ekonomie.
Aktivity