11. diel - Dátum a čas v C# - DateTime
V predchádzajúcom kvíze, Kvíz - Dedičnosť, statika, vlastnosti v C# .NET OOP, sme si overili nadobudnuté skúsenosti z predchádzajúcich lekcií.
DateTime
Pre prácu s dátumom a časom slúži v .NET frameworku trieda
DateTime
. Použijeme ju ako dátový typ na 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 aj 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 je možné inštanciu DateTime
vytvoriť.
Najprv si vytvoríme inštanciu pomocou bezparametrického konštruktora:
{CSHARP_CONSOLE}
DateTime dateTime = new DateTime();
Console.WriteLine(dateTime);
Console.ReadKey();
{/CSHARP_CONSOLE}
Výstupom programu bude niečo také:
Konzolová aplikácia
01.01.0001 0:00:00
Teraz si ukážme dva najzákladnejšie konštruktory, pomocou ktorých
môžeme inštanciu DateTime
vytvoriť.
Najprv vytvorme samotný dátum bez času (teda presnejšie čas sa nebude
nastavovať a zostane 0:00:00
). Špecifikujeme rok, mesiac a
deň:
{CSHARP_CONSOLE}
DateTime dateTime = new DateTime(2016, 7, 15);
Console.WriteLine(dateTime);
{/CSHARP_CONSOLE}
A výstup:
Konzolová aplikácia
15.07.2016 0:00:00
Ak si budeme priať zadať aj dátum aj čas, môžeme čas pripísať vo formáte:
DateTime dateTime = 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 dateTime = DateTime.Now;
Console.WriteLine("Today is: {0}", dateTime);
Console.ReadKey();
{/CSHARP_CONSOLE}
A výstup:
Konzolová aplikácia
Today is: 5/12/2016 10:49:08
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á mnoho 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 desaťmilióntinu sekundy. Môže sa vám to
niekedy hodiť na veľmi presné výpočty.
Okrem zložiek nám .NET umožňuje zistiť:
DayOfWeek
- Vracia deň v týždni v tzv. výpočtovom type, ktorý si vysvetlíme v ďalších lekciách C# kurzu. Zatiaľ si povieme, že výstupnou hodnotou môže byť napr.DayOfWeek.Monday
. Pri výpise sa podľa regionálneho nastavenia systému prevedie nastring
.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 k tomu vlastnosť Date
, ktorá vráti
DateTime
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 dateTime = DateTime.Now;
Console.WriteLine("Today is {0} {1}.", dateTime.DayOfWeek, dateTime.Day);
Console.WriteLine("It is month number {0} of the year {1}.", dateTime.Month, dateTime.Year);
Console.WriteLine("{0} hours, {1} minutes and {2} seconds.", dateTime.Hour, dateTime.Minute, dateTime.Second);
Console.ReadKey();
{/CSHARP_CONSOLE}
Výsledok:
Konzolová aplikácia
Today is Friday 12.
It is month number 5 of the year 2023.
10 hours, 51 minutes and 31 seconds
Vďaka tomu, že mám anglický operačný systém, C# vracia aj anglické mená dní. Vy ich budete mať slovenská. 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 nemenia inštanciu
DateTime
, ale vracajú novú, v ktorej sú dané zmeny
vykonané!
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úžia 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()
.
Statické metódy
Samotná trieda má na sebe aj statické metódy:
DaysInMonth()
- Statická metóda vracajúca počet dní v zadanom mesiaci. Parametre sú rok a mesiac (rok preto, že mohol byť prestupný 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 aj čas. DateTime
má na tieto účely
metódu Parse()
, ako aj TryParse()
.
V najjednoduchšej podobe načítame dátum a čas takto:
DateTime date = DateTime.Parse(Console.ReadLine());
Formát dátumu a času potom závisí od regionálneho nastavenia,
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 na to tzv. pattern. Ten môže mať napr. nasledujúcu podobu:
string pattern = "dd.M.yyyy";
Tabuľka týchto hodnôt je trochu vyčerpávajúca, záujemca odkážem na oficiálnu dokumentáciu, kde sú vysvetlené jednotlivé zložky patternu: http://msdn.microsoft.com/…kb3ddd4.aspx
Na parsovanie potom použijeme metódu ParseExact()
a odovzdáme
jej náš pattern takto:
DateTime date = DateTime.ParseExact(Console.ReadLine(), pattern, null);
Aj tá má samozrejme podobnú metódu TryParseExact()
.
Teraz sa pozrime na prevod dátumu do textu, ten nám bude užitočný najmä
pri výpise dátumu. 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:
dateTime.ToString("MMMM dd, yyyy");
Predpripravené máme štyri formáty, dva na výpis len dáta a dva na výpis len času. Vypisovať môžeme v dlhom alebo krátkom formáte:
ToShortDateString()
,ToShortTimeString()
,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álny (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 v DateTime
sa môžeme
opýtať pomocou vlastnosti Kind
. Na vytvorenie
DateTime
v UTC použijeme konštruktor ako so zadaním času,
avšak zadáme aj ďalší parameter s kind. Typ DateTime
môžeme
zmeniť pomocou statickej metódy SpecifyKind()
. 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ód
ToLocalTime()
a ToUniversalTime().
TimeSpan
S DateTime
súvisí ešte TimeSpan
. Ten slúži na
uchovávanie rozdielu medzi dvoma dátami. 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 dve inštancie
DateTime
. TimeSpan
môžeme tiež k
DateTime
pripočítať pomocou metódy Add()
na
inštancii 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
.
Pokiaľ chceme celý interval vyjadriť v jednej jednotke, použijeme
vlastnosti predsadené Total
. Na rozdiel od vyššie uvedených
vracia double
, nie int
:
TotalDays
,TotalHours
,TotalMinutes
,TotalSeconds
,TotalMilliseconds
.
Metódy
TimeSpan
má niekoľko konštruktorov, ukážeme si dvoch
najzákladnejších:
TimeSpan ts = new TimeSpan(hours, minutes, seconds); TimeSpan ts = new TimeSpan(days, hours, minutes, seconds);
Metódy sú podobné, ako na triede DateTime
, opäť tu máme
metódu Add()
, ktorá pridá k TimeSpan
ďalšie
TimeSpan
. TimeSpan
môžeme vytvoriť statickými
metódami z intervalu v rôznych jednotkách:
FromDays()
,FromHours()
,FromMinutes()
,FromSeconds()
,FromMilliseconds()
.
Pre Parse()
a ToString()
platí to isté, ako pre
DateTime
.
Poďme si urobiť ešte jeden príklad. Spýtame sa užívateľa na jeho
dátum narodenia a z toho vypočítame jeho vek. Povieme mu aj, koľko mu je
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 iba k počtu dní v intervale. Dni vydelíme
365.255
a zaokrúhlime dole. Pre nepatrné množstvo dát narodenia
to nemusí fungovať, ale to nás teraz príliš nezaťažuje, len si chceme
TimeSpan
vyskúšať:
{CSHARP_CONSOLE}
Console.WriteLine("Enter your date of birth: ");
DateTime born = DateTime.Parse(Console.ReadLine());
TimeSpan age = DateTime.Today - born;
Console.WriteLine("You are {0} years old", Math.Floor(age.Days/365.255));
Console.WriteLine("You are {0} days or {1} hours old", age.TotalDays, age.TotalHours);
Console.ReadKey();
{/CSHARP_CONSOLE}
Výstup:
Konzolová aplikácia
Enter your date of birth
15.1.1989
You are 35 years old
You are 12997 days or 311928 hours old
Všimnite si, že TimeSpan
vznikne naozaj jednoduchým
odčítaním dvoch DateTime
. Keď budeme zas niekedy tvoriť
objekty užívateľov, budeme u nich ukladať namiesto veku dátum narodenia. Z
neho potom dokážeme vek jednoducho spočítať a tak bude stále aktuálny.
Môžete si to skúsiť.
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é 3x (145.99 kB)
Aplikácia je vrátane zdrojových kódov v jazyku C#