IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
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í.

Lekce 11 - Datum a čas v Dartu

V minulé lekci, Gettery, settery a kaskádový operátor v Dartu, jsme si ukázali gettery a settery. Ty v dnešním Dart tutoriálu budeme potřebovat, ukážeme si totiž, jak se v Dartu pracuje s datem a časem.

DateTime

Pro práci s datem a časem slouží v Dartu třída DateTime. Použijeme ji jako datový typ pro uložení data nebo času. Když se zamyslíme nad pojetím data a času, tak vše je v podstatě čas, uběhnutý od nějakého počátečního bodu. Proto Dart zvolil jeden společný typ pro datum i pro čas. Třída je poměrně chytrá a má mnoho užitečných vlastností a metod. My si je zde dnes ukážeme.

Vytvoření instance

Začněme tím, jak lze instanci DateTime vytvořit. Vytvoříme si projekt s názvem datum_a_cas.

Třída DateTime má oproti standardnímu konstruktoru i několik pojmenovaných konstruktorů. Jsou jimi DateTime.now(), DateTime.utc(), DateTime.fromMicrosecondsSinceEpoch() a DateTime.fromMillisecondsSinceEpoch(). Pro tuto lekci nám bude stačit pouze standardní konstruktor a DateTime.now(). Znovu si všimněte, jak jsou pojmenované konstruktory, jako je DateTime.now() skvělé v tom, že nám dokonale popíší, co vlastně dělají. Vytvoříme instanci s aktuálním datem a časem:

DateTime datumCas = new DateTime.now();
print(datumCas);

Výstup programu:

Konzolová aplikace
2017-12-24 14:41:29.393831

Je důležité zmínit, že datum a čas v této instanci reprezentující aktuální datum a čas již neběží a hodnoty jsou tak napevno nastaveny při vytvoření instance. Pokud bychom chtěli aktualizovat datum a čas, musíme vytvořit novou instanci.

Nyní si ukažme standardní konstruktor. Ten bere jeden povinný parametr, rok, a řadu nepovinných parametrů.

DateTime datumCas = new DateTime(2017);
print(datumCas);

Výstup programu:

Konzolová aplikace
2017-01-01 00:00:00.000

Parametry můžeme postupně i dále datum a čas upřesňovat, parametry jsou celočíselné a jsou v tomto pořadí: year, month = 1, day = 1, hour = 0, minute = 0, second = 0, millisecond = 0, microsecond = 0.

Zkusme si tedy nastavit datum a čas na 16. srpna 2017 na 3:15:

DateTime datumCas = new DateTime(2017, 8, 16, 3, 15);
print(datumCas);

Výstup programu:

Konzolová aplikace
2017-08-16 03:15:00.000

Vlastnosti

DateTime má mnoho vlastností, které slouží k přístupu k jednotlivým složkám data a času:

  • year
  • month
  • day
  • hour
  • minute
  • second
  • millisecond
  • microsecond

Můžeme se zeptat ještě na millisecondsSinceEpoch či microsecondsSinceEpoch, ve kterých je datum a čas reprezentován od počátku "unixové epochy" (1970-01-01T00:00:00Z (UTC)). Jedná se o velmi vysoké číslo, které se nám může hodit pro velmi přesné výpočty.

Kromě složek nám Dart umožňuje zjistit:

  • day – Den v měsíci. Vrací tedy hodnoty 1-31.
  • weekday – Den v týdnu. Vrací tedy hodnoty 1-7, kde 1 je pondělí.

Všechny hodnoty dnů a měsíců jsou uloženy jako konstanty na třídě DateTime.

Vyzkoušejme si vlastnosti na dalším programu:

DateTime datumCas = new DateTime.now();
print('Dnes je ${datumCas.weekday}. den v týdnu, ${datumCas.day}. den v měsíci.');
print('Je ${datumCas.month}. měsíc a rok ${datumCas.year}.');
print('${datumCas.hour} hodin, ${datumCas.minute} minut a ${datumCas.second} sekund.');

Výstup programu:

Konzolová aplikace
Dnes je 7. den v týdnu, 24. den v měsíci.
Je 12. měsíc a rok 2017.
15 hodin, 9 minut a 5 sekund.

Metody

Nyní se podívejme na metody.

Změna vnitřní hodnoty

Pozor, metody nemění instanci DateTime, ale vrací novou, ve které jsou dané změny provedeny!

S vnitřní hodnotou data a času můžeme velmi jednoduše manipulovat pomocí metod, které přidávají/odebírají různé časové úseky. Jako parametr berou dobu trvání, instanci třídy Duration, kterou chceme přidat/odebrat. Obě metody se dají samozřejmě nahradit tou druhou, stačí jen použít záporné hodnoty:

  • add()
  • subtract()

Porovnání s jiným datumem

Na rozhodnutí, zda je dané datum a čas před/za jiným můžeme využít tyto chytré metody, které vrací true/false.

  • isBefore()
  • isAfter()

Pro porovnání (například při řazení více datumů) slouží následující metoda. Ta vrací -1, pokud je datum před druhým (datum v parametru), 0, pokud jsou stejné a 1, pokud je datum po druhém.

  • compareTo()

Můžeme si také vyžádat rozdíl mezi 2 datumy v podobně objektu třídy Duration, kterou již trochu známe.

  • difference()

Statické metody

Samotná třída má na sobě také statickou metodu parse(). Do této metody můžeme vkládat textové řetězce, například v podobě "2012-02-27 13:27:00".

DateFormat

Samotná třída DateTime umí pracovat pouze s datumy a časy, není však extra užitečná, pokud chceme datumy hezky vypisovat. Pro tyto účely slouží např. třída DateFormat z balíčku intl. Ta přijímá jako parametr metody parse() formátovací řetězce, všechny řetězce pro výpis najdete v této tabulce.

Vyzkoušíme si vypsat jaký je dnes den:

DateTime aktualniDatum = new DateTime.now();
print(new DateFormat('EEEE, M/d/y').format(aktualniDatum));

Výstup programu:

Konzolová aplikace
Sunday, 12/24/2017

Vidíme, že nám kód funguje jak jsme chtěli. Může se však stát, že budeme chtít vypsat text s jinou lokalizací. Například s českou. V tom případě musíme inicializovat českou lokalizaci a následně do metody parse() vkládat druhý parametr, lokalizaci:

initializeDateFormatting('cs'); // inicializování českého jazyka
DateTime aktualniDatum = new DateTime.now();
print(new DateFormat('EEEE, M/d/y').format(aktualniDatum));
print(new DateFormat('EEEE, M/d/y', 'cs').format(aktualniDatum));

Výstup programu:

Konzolová aplikace
Sunday, 12/24/2017
neděle, 12/24/2017

Vidíme, že pokud nezadáme lokalizaci, vypíše se nám datum v defaultní lokalizaci. Tu můžeme, pokud chceme přenastavit defaultní lokalizaci a nechceme neustále zadávat druhý parametr, nastavit:

initializeDateFormatting('cs'); // inicializování českého jazyka
Intl.defaultLocale = 'cs'; // nastavení defaultní lokalizace
DateTime aktualniDatum = new DateTime.now();
print(new DateFormat('EEEE, M/d/y').format(aktualniDatum));
print(new DateFormat('EEEE, M/d/y', 'cs').format(aktualniDatum));

Výstup programu:

Konzolová aplikace
neděle, 12/24/2017
neděle, 12/24/2017

Vidíme, že již nezáleží na tom, zda-li zadáme českou lokalizaci nebo ne, jelikož je jako výchozí.

Duration

Poslední třída, na kterou se v této lekci podíváme, bude třída Duration. Tu již známe poměrně dobře i z předešlých lekcí. Pomocí ní můžeme přehledně a jednoduše nastavit nějakou dobu trvání.

Třída má řadu pojmenovaných konstruktorů, kterými můžeme nastavit jednotlivé části času. Zkusme si tedy nastavit dobu např. na 2 hodiny, 28 minut a 13 sekund a následně hodnotu vypsat:

print(new Duration(hours: 2, minutes: 28, seconds: 13));

Výstup programu:

Konzolová aplikace
2:28:13.000000

Vlastnosti

Duration nemá mnoho vlastností. Má vlastně jen ty, díky kterým můžeme zjistit dobu trvání v různých časových jednotkách - dny, hodiny, minuty, sekundy, ...

  • inDays
  • inHours
  • inMinutes
  • inSeconds
  • inMilliseconds
  • inMicroseconds

Zkusíme si tedy vypsat nějakou dobu trvání v sekundách:

print(new Duration(hours: 2, minutes: 28, seconds: 13).inSeconds);

Výstup programu:

Konzolová aplikace
8893

Metody

Duration nemá ani mnoho metod. Má metodu compareTo(), jejíž chování je obdobné ke stejnojmenné metodě z DateTime a také má metodu abs(), která vrací absolutní hodnotu doby trvání.

  • compareTo()
  • abs()

V příští lekci, Kolekce Set, Queue a Map v Dartu, si ukážeme kolekce. Vytvoříme si jednoduchou databázi.


 

Měl jsi s čímkoli problém? Stáhni si vzorovou aplikaci níže a porovnej ji se svým projektem, chybu tak snadno najdeš.

Stáhnout

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

Staženo 5x (1.84 kB)
Aplikace je včetně zdrojových kódů v jazyce Dart

 

Předchozí článek
Gettery, settery a kaskádový operátor v Dartu
Všechny články v sekci
Objektově orientované programování v Dartu
Přeskočit článek
(nedoporučujeme)
Kolekce Set, Queue a Map v Dartu
Článek pro vás napsal Honza Bittner
Avatar
Uživatelské hodnocení:
2 hlasů
FIT ČVUT alumnus :-) Sleduj mě na https://twitter.com/tenhobi a ptej se na cokoli na https://github.com/tenhobi/ama.
Aktivity