11. diel - Dátum a čas v Dart
V minulej lekcii, Getter, Setter a kaskádový operátor v Dart , sme si ukázali Getter a setter. Tie v dnešnom Dart tutoriálu budeme potrebovať, ukážeme si totiž, ako sa v Dart pracuje s dátumom a časom.
DateTime
Pre prácu s dátumom a časom slúžia v Dart trieda DateTime
.
Použijeme ju ako dátový typ pre uloženie dátumu alebo času. Keď sa
zamyslíme nad poňatím dátumu a času, tak všetko je v podstate čas,
ubehnutú od nejakého počiatočného bodu. Preto Dart zvolil jeden spoločný
typ pre dátum i pre čas. Trieda je pomerne múdra a má mnoho užitočných
vlastností a metód. My si ich tu dnes ukážeme.
Vytvorenie inštancie
Začnime tým, ako možno inštanciu DateTime
vytvoriť.
Vytvoríme si projekt s názvom datum_a_cas
.
Trieda DateTime
má oproti štandardnému konstruktoru aj
niekoľko pomenovaných konstruktoru. Sú nimi DateTime.now()
,
DateTime.utc()
, DateTime.fromMicrosecondsSinceEpoch()
a DateTime.fromMillisecondsSinceEpoch()
. Pre túto lekciu nám bude
stačiť iba štandardné konštruktor a DateTime.now()
. Znovu si
všimnite, ako sú pomenované konštruktory, ako je DateTime.now()
skvelé v tom, že nám dokonale opíšu, čo vlastne robia. Vytvoríme
inštanciu s aktuálnym dátumom a časom:
DateTime datumCas = new DateTime.now();
print(datumCas);
Výstup programu:
Konzolová aplikácia
2017-12-24 14:41:29.393831
Je dôležité spomenúť, že dátum a čas v tejto inštancii reprezentujúci aktuálny dátum a čas už nebeží a hodnoty sú tak napevno nastavené pri vytvorení inštancie. Ak by sme chceli aktualizovať dátum a čas, musíme vytvoriť novú inštanciu.
Teraz si ukážme štandardné konštruktor. Ten berie jeden povinný parameter, rok, a rad nepovinných parametrov.
DateTime datumCas = new DateTime(2017); print(datumCas);
Výstup programu:
Konzolová aplikácia
2017-01-01 00:00:00.000
Parametre môžeme postupne aj ďalej dátum a čas upresňovať, parametre
sú celočíselné a sú v tomto poradí: year
,
month = 1
, day = 1
, hour = 0
,
minute = 0
, second = 0
, millisecond = 0
,
microsecond = 0
.
Skúsme si teda nastaviť dátum a čas na 16. augusta 2017 na 3:15:
DateTime datumCas = new DateTime(2017, 8, 16, 3, 15); print(datumCas);
Výstup programu:
Konzolová aplikácia
2017-08-16 03:15:00.000
Vlastnosti
DateTime
má veľa vlastností, ktoré slúžia na prístup k
jednotlivým zložkám dátumu a času:
year
month
day
hour
minute
second
millisecond
microsecond
Môžeme sa opýtať ešte na millisecondsSinceEpoch
či
microsecondsSinceEpoch
, v ktorých je dátum a čas reprezentovaný
od počiatku "unixové epochy" (1970-01-01T00: 00: 00Z (UTC)). Jedná sa o
veľmi vysoké číslo, ktoré sa nám môže hodiť pre veľmi presné
výpočty.
Okrem zložiek nám Dart umožňuje zistiť:
day
- Deň v mesiaci. Vracia teda hodnoty 1-31.weekday
- Deň v týždni. Vracia teda hodnoty 1-7, kde 1 je pondelok.
Všetky hodnoty dní a mesiacov sú uložené ako konštanty na triede
DateTime
.
Vyskúšajme si vlastnosti na ďalšom programe:
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á aplikácia
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.
Metódy
Teraz sa pozrime na metódy.
Zmena vnútornej hodnoty
Pozor, metódy nemení inštanciu DateTime
, ale vracia
novú, v ktorej sú dané zmeny urobené!
S vnútornou hodnotou dátumu a času môžeme veľmi jednoducho manipulovať
pomocou metód, ktoré pridávajú / odoberajú rôzne časové úseky. Ako
parameter berú dobu trvania, inštanciu triedy Duration
, ktorú
chceme pridať / odobrať. Obe metódy sa dajú samozrejme nahradiť tou druhou,
stačí len použiť záporné hodnoty:
add()
subtract()
Porovnaní s iným dátumom
Na rozhodnutie, či je daný dátum a čas pred / za iným môžeme využiť
tieto chytré metódy, ktoré vracia true
/ false
.
isBefore()
isAfter()
Pre porovnanie (napríklad pri radení viac dátumov) slúži nasledujúca
metóda. Tá vracia -1
, ak je dátum pred druhým (dátum v
parametri), 0
, ak sú rovnaké a 1
, ak je dátum po
druhom.
compareTo()
Môžeme si tiež vyžiadať rozdiel medzi 2 dátumy v podobne objekte triedy Duration, ktorú už trochu poznáme.
difference()
Statickej metódy
Samotná trieda má na sebe tiež statickú metódu parse()
. Do
tejto metódy môžeme vkladať textové reťazce, napríklad v podobe
"2012-02-27 13:27:00".
DateFormat
Samotná trieda DateTime
vie pracovať len s dátumy a časy,
nie je však extra užitočná, ak chceme dátumy pekne vypisovať. Pre tieto
účely slúžia napr. Trieda DateFormat
z balíčka intl
. Tá
prijíma ako parameter metódy parse()
formátovacie reťazca,
všetky reťazce pre výpis nájdete v tejto
tabuľke.
Vyskúšame si vypísať aký je dnes deň:
DateTime aktualniDatum = new DateTime.now(); print(new DateFormat('EEEE, M/d/y').format(aktualniDatum));
Výstup programu:
Konzolová aplikácia
Sunday, 12/24/2017
Vidíme, že nám kód funguje ako sme chceli. Môže sa však stať, že
budeme chcieť vypísať text s inou lokalizáciou. Napríklad s českou. V tom
prípade musíme inicializovať českú lokalizáciu a následne do metódy
parse()
vkladať druhý parameter, lokalizáciu:
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á aplikácia
Sunday, 12/24/2017
neděle, 12/24/2017
Vidíme, že ak nezadáme lokalizáciu, vypíše sa nám dátum v defaultný lokalizácii. Tú môžeme, ak chceme prenastaviť defaultný lokalizáciu a nechceme neustále zadávať druhý parameter, nastaviť:
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á aplikácia
neděle, 12/24/2017
neděle, 12/24/2017
Vidíme, že už nezáleží na tom, či ak zadáme českú lokalizáciu alebo nie, pretože je ako predvolené.
Duration
Posledný trieda, na ktorú sa v tejto lekcii pozrieme, bude trieda
Duration
. Tú už poznáme pomerne dobre aj z predošlých lekcií.
Pomocou nej môžeme prehľadne a jednoducho nastaviť nejakú dobu trvania.
Trieda má rad pomenovaných konstruktoru, ktorými môžeme nastaviť jednotlivé časti času. Skúsme si teda nastaviť dobu napr. Na 2 hodiny, 28 minút a 13 sekúnd a následne hodnotu vypísať:
print(new Duration(hours: 2, minutes: 28, seconds: 13));
Výstup programu:
Konzolová aplikácia
2:28:13.000000
Vlastnosti
Duration
nemá veľa vlastností. Má vlastne len tie, vďaka
ktorým môžeme zistiť dobu trvania v rôznych časových jednotkách - dni,
hodiny, minúty, sekundy, ...
inDays
inHours
inMinutes
inSeconds
inMilliseconds
inMicroseconds
Skúsime si teda vypísať nejakú dobu trvania v sekundách:
print(new Duration(hours: 2, minutes: 28, seconds: 13).inSeconds);
Výstup programu:
Konzolová aplikácia
8893
Metódy
Duration
nemá ani mnoho metód. Má metódu
compareTo()
, ktorej správanie je obdobné k rovnomennej metóde z
DateTime
a tiež má metódu abs()
, ktorá vracia
absolútnu hodnotu doby trvania.
compareTo()
abs()
V budúcej lekcii, Kolekcia Set, Queue a Map v Dart , si ukážeme kolekcie. Vytvoríme si jednoduchú databázu.
Mal si s čímkoľvek problém? Stiahni si vzorovú aplikáciu nižšie a porovnaj ju so svojím projektom, chybu tak ľahko nájdeš.
Stiahnuť
Stiahnutím nasledujúceho súboru súhlasíš s licenčnými podmienkami
Stiahnuté 5x (1.84 kB)
Aplikácia je vrátane zdrojových kódov v jazyku Dart