IT rekvalifikácia. Seniorní programátori zarábajú až 6 000 €/mesiac a rekvalifikácia je prvým krokom. Zisti, ako na to!

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

 

Predchádzajúci článok
Getter, Setter a kaskádový operátor v Dart
Všetky články v sekcii
Objektovo orientované programovanie v Dart
Preskočiť článok
(neodporúčame)
Kolekcia Set, Queue a Map v Dart
Článok pre vás napísal Honza Bittner
Avatar
Užívateľské hodnotenie:
Ešte nikto nehodnotil, buď prvý!
FIT ČVUT alumnus :-) Sleduj mě na https://twitter.com/tenhobi a ptej se na cokoli na https://github.com/tenhobi/ama.
Aktivity