11. diel - Dátum a čas v C #
V minulej lekcii, Vlastnosti , sme si ukázali vlastnosti. Tie v dnešnom C # tutoriálu budeme potrebovať, ukážeme si totiž, ako sa v .NET pracuje s dátumom a časom.
DateTime
Pre prácu s dátumom a časom slúžia v .NET frameworku 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 Microsoft
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 DatumACas
. Najprv si vytvoríme
inštanciu pomocou bezparametrického konstruktoru:
{CSHARP_CONSOLE}
DateTime datumCas = new DateTime();
Console.WriteLine(datumCas);
Console.ReadKey();
{/CSHARP_CONSOLE}
Výstupom programu bude niečo takéto:
Konzolová aplikácia
1. 1. 0001 0:00:00
Teraz si ukážme 2 nezákladnější konštruktory, pomocou ktorých
môžeme inštanciu DateTime
vytvoriť.
Najprv vytvorme dátum samotný bez času (teda presnejšie čas sa nebude
nastavovať a zostane 0:00:00
). Špecifikujeme rok, mesiac a
deň:
{CSHARP_CONSOLE}
DateTime datumCas = new DateTime(2016, 7, 15);
Console.WriteLine(datumCas);
{/CSHARP_CONSOLE}
A výstup:
Konzolová aplikácia
15. 7. 2016 0:00:00
Ak si budeme želať zadať aj dátum i čas, môžeme čas pripísať vo formáte:
DateTime datumCas = new DateTime(2016, 7, 15, 3, 15, 0);
Teraz je čas nastavený na 3:15 ráno.
Určite je dôležité vedieť, ako sa dostaneme k aktuálnemu dátumu a
času. Slúži na to statická vlastnosť Now
, ktorá nám
vráti inštanciu DateTime
, nastavenú na súčasný
čas. Voláme ju pochopiteľne priamo na triede. Čas v tejto inštancii
už nebeží, keď potrebujeme po nejakej dobe opäť aktuálny čas,
musíme si vytvoriť pomocou Now
novú inštanciu. Poďme si to
skúsiť:
{CSHARP_CONSOLE}
DateTime datumCas = DateTime.Now;
Console.WriteLine("Dnes je: {0}", datumCas);
Console.ReadKey();
{/CSHARP_CONSOLE}
A výstup:
Konzolová aplikácia
Dnes je: 6.3.2017 14:40:23
Podobná je vlastnosť Today
, ktorá vráti
aktuálny dátum a čas nastavený na 0:00:00
.
Ďalšie vlastnosti
Ako už bolo povedané, DateTime
má veľa vlastností, ktoré
slúžia na prístup k jednotlivým zložkám dátumu a času:
Day
Month
Year
Hour
Minute
Second
Millisecond
Môžeme sa opýtať ešte na tzv.
Ticks
, v ktorých je dátum a čas vlastne interne uložený. Jedná sa o veľmi vysoké číslo, jeden tick reprezentuje sto nanosekúnd, teda desetimiliontinu sekundy. Môže sa vám to niekedy hodiť pre veľmi presné výpočty.Okrem zložiek nám .NET umožňuje zistiť:
DayOfWeek
- Vracia deň v týždni v tzv. Vymenované typu, ktorý si vysvetlíme v ďalších lekciách C # kurzu. Zatiaľ si povieme, že výstupné hodnotou môže byť napr.DayOfWeek.Monday
. Pri výpisu sa podľa regionálneho nastavenia systému prevedie dostring
u.DayOfYear
- Deň v roku, teda vracia hodnoty1
-366
.Z DateTime môžeme oddeliť zložku s časom a nastaviť ho na
0:00:00
, slúži na to vlastnosťDate
, ktorá vrátiDateTime
s pôvodným dátumom a bez času. Môže to byť užitočné, keď pracujeme s celými dňami a čas by nám spôsoboval nepresnosti.Vyskúšajme si vlastnosti na ďalšom programe:
{CSHARP_CONSOLE}
DateTime datumCas = DateTime.Now;
Console.WriteLine("Dnes je {0} {1}.", datumCas.DayOfWeek, datumCas.Day);
Console.WriteLine("Je {0}. mesiac a rok {1}.", datumCas.Month, datumCas.Year);
Console.WriteLine("{0} hodín, {1} minút a {2} sekúnd.", datumCas.Hour, datumCas.Minute, datumCas.Second);
Console.ReadKey();
{/CSHARP_CONSOLE}
výsledok:
Konzolová aplikácia
Dnes je Monday 6.
Je 3. mesiac a rok 2017.
12 hodín, 20 minút a 12 sekúnd.
Vďaka tomu, že mám anglický operačný systém, C # vracia aj anglická mená dní. Vy ich budete mať česká. Toto je výhodné, pretože sa nemusíme starať o to, aby sa každému zobrazili správne, podľa jeho regionálneho nastavenia, C # to za nás urobí.
Metódy
Teraz sa pozrime na metódy. Pozor, metódy nemení inštanciu
DateTime
, ale vracia novú, v ktorej sú dané zmeny
urobené!
Zmena vnútornej hodnoty
S vnútornou hodnotou dátumu a času môžeme veľmi jednoducho manipulovať pomocou metód, ktoré pridávajú rôzne časové úseky. Ako parameter berú počet úsekov (napr. Dní), ktoré chceme pridať. Ak ich chceme naopak ubrať, použijeme zápornú hodnotu. Za účelom zmeny hodnoty teda slúži metódy:
AddDays()
AddMonths()
AddYears()
AddHours()
AddMinutes()
AddSecond()
AddMilliseconds()
AddTicks()
Môžeme sa opýtať, či je daná inštancia
DateTime
vo formáte letného času:
IsDaylightSavingTime()
Statickej metódy
Samotná trieda má na sebe tiež statické metódy:
DaysInMonth()
- Statická metóda vracajúci počet dní v zadanom mesiaci. Parametre sú je rok a mesiac (rok preto, že mohol byť priestupný február).IsLeapYear()
- Vraciatrue
pre priestupný rok, parametrom je rok.
Parsovanie a prevod na text
Asi sa nám bude často stávať, že budeme chcieť po užívateľovi zadať
nejaké dátum, prípadne i čas. DateTime
má pre tieto účely
ako metódu Parse()
, tak i TryParse()
.
V najjednoduchšej podobe načítame dátum a čas nasledovne:
DateTime datum = DateTime.Parse(Console.ReadLine());
Formát dátumu a času potom závisí na regionálnom nastavení,
väčšinou sa očakáva napr. "1.1.2012 13:00"
. Keď nezadáme
čas, nič sa nestane, len tam bude 0:00:00
.
Keď chceme zadávaný formát ovplyvniť, použijeme k tomu tzv. Pattern. Ten môže mať napr. Nasledujúce podobu:
string pattern = "dd.M.yyyy";
Tabuľka týchto hodnôt je trochu vyčerpávajúci, záujemcov odkáže na oficiálnej dokumentáciu, kde sú vysvetlené jednotlivé zložky patterne: http://msdn.microsoft.com/...kb3ddd4.aspx
K parsovanie potom použijeme metódu ParseExact()
a odovzdáme
jej náš pattern takto:
DateTime datum = DateTime.ParseExact(Console.ReadLine(), pattern, null);
Aj tá má samozrejme podobnú metódu TryParseExact()
.
Teraz sa pozrime na prevod dáta do textu, ten nám bude užitočný najmä
pri výpise dáta. Samozrejme funguje metóda
ToString()
, ktorá je bez parametrov a C # ju
volá implicitne. Metóde môžeme dať ako parameter pattern, aby vrátila
dátum v nami požadovanom formáte:
datumCas.ToString("MMMM dd, yyyy");
Predpripravené máme dva 4 formáty, 2 pre výpis len dáta a 2 pre výpis len času. Vypisovať môžeme v dlhom alebo krátkom formáte:
ToShortDateString()
ToShorTimeString()
ToLongDateString()
ToLongTimeString()
Dáta aj čas môžeme bežne porovnávať pomocou operátorov
>
` (interne je to vlastne veľmi vysoké číslo s počtom ticks, dáta je teda veľmi jednoduché porovnávať).Určite sa pozrite na cvičenie k tejto lekcii, obsahuje niekoľko dôležitých úloh na najčastejšie operácie s dátumom a časom.
Ako iste viete, čas môže byť vyjadrený ako lokálne (tak, ako je v našej časovej zóne) alebo ako medzinárodný (tzv. Formát UTC). Tutoriál nepredpokladá prácu s medzinárodným časom. Pokiaľ si budete priať zistiť aktuálny čas v UTC, použite statickú vlastnosť
UtcNow
. Akého typu je hodnota vDateTime
sa môžeme spýtať pomocou vlastnostiKind
. Pre vytvorenieDateTime
v GMT použijeme konštruktor ako sa zadaním času, avšak zadáme i ďalšie parameter s kind. TypDateTime
môžeme zmeniť pomocou statickej metódySpecifyKind()
. Zatiaľ sa tým tu nebudeme zaoberať, len som chcel naviesť prípadných záujemcov na správne metódy. Medzi týmito dvoma časmi môžeme tiež prevádzať pomocou metódToLocalTime()
aToUniversalTime().
TimeSpan
S DateTime
súvisí ešte TimeSpan
. Ten slúži na
uchovávanie rozdielu medzi dvoma dátumami. Rozdiel oproti
DateTime
je v tom, že DateTime
reprezentuje celé
dátum (bod na časovej osi), TimeSpan
reprezentuje nejaký interval (či už sú to roky alebo
sekundy).
Na DateTime
existuje vlastnosť
TimeOfDay
, ktorá vráti TimeSpan
s
časom a dátum zahodí.
TimeSpan
vznikne, keď odpočítame 2 inštancie
DateTime
**. TimeSpan
môžeme tiež k
DateTime
pripočítať pomocou metódy Add()
na
inštanciu DateTime
.
Vlastnosti
K jednotlivým zložkám TimeSpan
u sa dostaneme pomocou
vlastností (rovnako, ako u DateTime
, iba sú v množnom
čísle):
Days
Hours
Minutes
Seconds
Milliseconds
Ticks
Ak chceme celý interval vyjadriť v jednej jednotke, použijeme vlastnosti predsadené
Total
. Na rozdiel od vyššie uvedených vraciadouble
, nieint
:
TotalDays
TotalHours
TotalMinutes
TotalSeconds
TotalMilliseconds
Metódy
TimeSpan
má niekoľko konstruktoru, ukážeme si dva
najzákladnejšie:
TimeSpan ts = new TimeSpan(hodiny, minúty, sekundy); TimeSpan ts = new TimeSpan(dni, hodiny, minúty, sekundy);
Metódy sú podobné, ako na triede DateTime
, opäť tu máme
metódu Add()
, ktorá pridá k TimeSpan
u ďalšej
TimeSpan
. TimeSpan
môžeme vytvoriť statickými
metódami z intervalu v rôznych jednotkách:
FromDays()
FromHours()
FromMinutes()
FromSeconds()
FromMilliseconds()
Pre
Parse()
aToString()
platí to isté, ako preDateTime
.Poďme si urobiť ešte jeden príklad. Spýtame sa používateľa na jeho dátum narodenia a z toho vypočítame jeho vek. Povieme mu aj, koľko mu ich dní a hodín. Výpočet veku urobíme zjednodušený.
TimeSpan
bohužiaľ neposkytuje zistenie rokov (kvôli tomu, že rok má vždy iný počet dní), dostaneme sa len na počet dní v intervale. Dni vydelíme365.255
a zaokrúhlime nadol. Pre nepatrné množstvo dát narodenia to nemusí fungovať, ale to nás teraz príliš nezaťažuje, len si chcemeTimeSpan
vyskúšať:
{CSHARP_CONSOLE}
Console.WriteLine("Zadaj dátum narodenia: ");
DateTime narozen = DateTime.Parse(Console.ReadLine());
TimeSpan vek = DateTime.Today - narozen;
Console.WriteLine("Je ti {0} rokov", Math.Floor(vek.Days/365.255));
Console.WriteLine("To je v dňoch {0} a v hodinách {1}", vek.TotalDays, vek.TotalHours);
Console.ReadKey();
{/CSHARP_CONSOLE}
Konzolová aplikácia
Zadaj dátum narodenia:
5.6.1989
Je ti 23 rokov
To je v dňoch 10136 a v hodinách 243264
Všimnite si, že TimeSpan
vznikne naozaj jednoduchým
odčítaním dvoch DateTime
. Až budeme zas niekedy tvoriť
objekty používateľov, budeme u nich ukladať miesto veku dátum narodenia. Z
neho potom dokážeme vek jednoducho spočítať a tak bude stále aktuálna.
Môžete si to skúsiť.
V budúcej lekcii, Riešené úlohy k 11. lekcii OOP v C # .NET , si ukážeme kolekciu, do ktorej možno na rozdiel od poľa jednoducho pridávať a odoberať záznamy. Vytvoríme si jednoduchú databázu.
V nasledujúcom cvičení, Riešené úlohy k 11. lekcii OOP v C # .NET, si precvičíme nadobudnuté skúsenosti z predchádzajúcich lekcií.
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é 965x (61.88 kB)
Aplikácia je vrátane zdrojových kódov v jazyku C#