Halloweenská akce! Na stránce s dobitím bodů zadej dole kód STRASIDELNYCH20 a získej porci +20% bodů zdarma!
Akce končí 31.10. o půlnoci.

Lekce 11 - Datum a čas v Dartu

Dart Objektově-orientované programování Datum a čas v Dartu

ONEbit hosting Unicorn College Tento obsah je dostupný zdarma v rámci projektu IT lidem. Vydávání, hosting a aktualizace umožňují jeho sponzoři.

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.


 

Stáhnout

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

 

 

Článek pro vás napsal Honza Bittner
Avatar
Jak se ti líbí článek?
1 hlasů
Milovník Dartu. Student FIT ČVUT. Sleduj mě na https://twitter.com/tenhobi a ptej se na cokoli na https://github.com/tenhobi/ama.
Aktivity (2)

 

 

Komentáře

Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zatím nikdo nevložil komentář - buď první!