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