14. diel - Dátum a čas v C# - DateOnly a TimeOnly
V predchádzajúcom cvičení, Riešené úlohy k 13. lekcii OOP v C# .NET, sme si precvičili získané skúsenosti z predchádzajúcich lekcií.
V dnešnom tutoriáli budeme pokračovať v práci s
dátumom a časom v C#. Predstavíme si štruktúry
DateOnly a TimeOnly. Vytvoríme niekoľko
ukážkových programov.
Štruktúra DateOnly
Táto štruktúra slúži na uloženie dátumu bez časovej
informácie. Štruktúra DateOnly nemá žiadnu časovú
informáciu, a preto predstavuje dátum od začiatku až do konca dňa. Také
správanie sa nám napríklad môže hodiť, ak chceme ukladať špecifické
dáta. Takými dátami môžu byť deň narodenia, výročia nejakej udalosti a
tak ďalej.
Oproti štruktúre DateTime má štruktúra
DateOnly tieto výhody:
- Štruktúra
DateTimemôže zmeniť dátum na budúci alebo predchádzajúci deň, ak je naň aplikovaná časová zóna. Toto sa sDateOnlystať nemôže. - Serializácia štruktúry
DateTimetiež zahŕňa časovú informáciu, čo môže byť v nejakých prípadoch na naše účely nežiaduce. - Štruktúra
DateTime v pamäti zaberá viac miesta v porovnaní s `DateOnlyštruktúrou.
Vytvorenie inštancie
Teraz si ukážeme spôsoby akými môžeme vytvoriť inštancie štruktúry
DateOnly. Najprv si vytvoríme nový projekt
DateOnly_TimeOnly cielený na verziu .NET 7 alebo
vyššiu.
Pozor! Štruktúry DateOnly a
TimeOnly sú v plnej funkčnosti dostupné iba pre verziu .NET 7 a
vyššiu a Visual Studio 2022 verziu 17.4 a vyššiu.
Teraz si ukážeme, ako vytvoriť DateOnly pomôcť volaní
bezparametrického konštruktora:
DateOnly defaultDate = new DateOnly(); Console.WriteLine("Default date: {0}", defaultDate);
Výstup programu vyzerá takto:
Konzolová aplikácia
Default date: 01.01.0001
V nasledujúcej ukážke sa pozrieme na to, ako vytvoriť štruktúru
DateOnly s nami vybranými parametrami:
DateOnly date = new DateOnly(2023, 10, 11); Console.WriteLine("Date with preset values: {0}", date);
Výstup programu vyzerá takto:
Konzolová aplikácia
Date with preset values: 11.10.2023
V poslednej ukážke týkajúcej sa vytvorenia inštancie si ukážeme, ako
vytvoriť DateOnly štruktúru s dnešným
dátumom. DateOnly štruktúra neobsahuje vlastnosť,
alebo metódu, ktorá by nám vytvorila DateOnly štruktúru s
dnešným dátumom. A preto musíme použiť statickú metódu
FromDateTime() zo štruktúry DateOnly nasledujúcim
spôsobom:
DateOnly todayDate = DateOnly.FromDateTime(DateTime.Now);
Console.WriteLine("Today is: {0}", todayDate);
Výstup programu vyzerá takto:
Konzolová aplikácia
Today is: 13.10.2023
Vlastnosti
Štruktúra DateOnly má nasledujúce vlastnosti:
Day- vracia hodnotu dňa,Month- vracia hodnotu mesiaca,Year- vracia hodnotu roka,DayOfYear- vracia, v koľkom dni v roku sa daný dátum nachádza (hodnota je v rozmedzí1-366),DayNumber- vracia počet dní od1. 1. 0001podľa Gregoriánskeho kalendára,DayOfWeek- vracia deň v týždniDayOfWeeks hodnotou dňa inštancie.
Prebrané vlastnosti si ukážeme v nasledujúcej ukážke:
DateOnly exampleDate = new DateOnly(2023, 10, 11); Console.WriteLine("The day of the week is {0} and numerically: {1}.", exampleDate.DayOfWeek, exampleDate.Day); Console.WriteLine("It is {0} month and year {1}.", exampleDate.Month, exampleDate.Year); Console.WriteLine("It has passed since the beginning of the Gregorian calendar {0} days. It is {1} day of the year.", exampleDate.DayNumber, exampleDate.DayOfYear);
Výstup programu vyzerá takto:
Konzolová aplikácia
The day of the week is Wednesday and numerically: 11.
It is 10 month and year 2023.
It has passed since the beginning of the Gregorian calendar 738803 days. It is 284 day of the year.
Metódy
Teraz sa pozrime na metódy. Metódy nemenia inštanciu
DateOnly, ale vracajú novú, v ktorej sú dané zmeny
vykonané.
Podobné metódy sme si prebrali pri štruktúre
DateTime v lekcii Dátum
a čas v C#.
Zmena vnútornej hodnoty
Rovnako ako pri štruktúre DateTime, tak aj pri
DateOnly môžeme s vnútornou hodnotou dáta 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.
Na zmenu vnútornej hodnoty máme k dispozícii metódy:
AddDays(),AddMonths(),AddYears().
Parsovanie
Rovnako ako sme si ukazovali parsovanie pre štruktúru
DateTime, funguje parsovanie aj pre štruktúru
DateOnly. Opäť môžeme použiť statické metódy
Parse(), ako aj TryParse() na štruktúre
DateOnly.
V najjednoduchšej podobe načítame dátum takto:
Console.Write("Enter the date in the format DD. MM. YYYY: "); DateOnly dateFromUser = DateOnly.Parse(Console.ReadLine()); Console.WriteLine("User entered this date: {0}", dateFromUser);
Výstup:
Konzolová aplikácia
Enter the date in the format DD. MM. YYYY: 13.10.2023
User entered this date: 13.10.2023
Keď chceme zadávaný formát ovplyvniť, použijeme na to takzvaný pattern. Ten môže mať napr. nasledujúcu podobu:
string datePattern = "dd.M.yyyy";
Viac o formátoch nájdeme v oficiálnej Microsoft dokumentácii.
Na parsovanie potom použijeme metódu ParseExact() a odovzdáme
jej náš pattern takto:
string datePattern = "dd.M.yyyy"; Console.Write("Enter the date in the format {0}: ", datePattern); DateOnly dateByPattern = DateOnly.ParseExact(Console.ReadLine(), datePattern, null); Console.WriteLine("The user entered this date according to the pattern: {0}", dateByPattern);
Dostaneme podobný výstup:
Konzolová aplikácia
Enter the date in the format dd.M.yyyy: 13.10.2023
The user entered this date according to the pattern: 13.10.2023
Popri ParseExact() môžeme použiť aj metódu
TryParseExact().
Prevod na text
Pre štruktúru DateOnly máme formátovanie vo vnútri volania
metódy ToString(). Nasledujúca ukážka nám vypíše do konzoly
dátum v požadovanom formáte:
DateOnly formattedDate = new DateOnly(2023, 10, 11); Console.WriteLine("Date with the format {0}", formattedDate.ToString("MMMM dd, yyyy"));
Výstup:
Konzolová aplikácia
Date with the format October 11, 2023
Štruktúra DateOnly má predpripravené pre výpis dátumu v
krátkom a dlhom formáte tieto metódy:
ToShortDateString(),ToLongDateString().
Štruktúru DateOnly môžeme porovnávať pomocou
operátorov porovnania: > < ==.
Štruktúra TimeOnly
Táto štruktúra predstavuje hodnotu času jedného dňa.
Hodnota štruktúry TimeOnly môže byť v intervale
00:00:00.0000000 - 23:59:59.9999999. Oproti
štruktúre TimeSpan má štruktúra TimeOnly tieto
výhody:
- Štruktúra
TimeSpanpredstavuje nejaký časový interval, ako napríklad čas nameraný na stopkách. Jeho hodnota môže byť aj záporná. To indikuje, že sa vraciame v čase, čo ale v kontexte indikácie špecifického času nejakého dňa nedáva zmysel. - Pri použití štruktúry
TimeSpanako časovej hodnoty dňa existuje riziko manipulácie jej hodnoty, ktorá tak by mohla byť vyššia ako 24 hodín. To sa pri štruktúreTimeOnlystať nemôže. - Štruktúra
TimeOnlyoprotiTimeSpanzaberá menej miesta v pamäti.
Vytvorenie inštancie
Inštanciu štruktúry TimeOnly môžeme vytvoriť volaním
bezparametrického konštruktora takto:
TimeOnly defaultTime = new TimeOnly(); Console.WriteLine("Default time: {0}", defaultTime);
Výstup programu vyzerá takto:
Konzolová aplikácia
Default time: 00:00
Inštanciu štruktúry TimeOnly môžeme vytvoriť aj s nami
vybranými parametrami v jej konštruktore:
TimeOnly time = new TimeOnly(23, 10, 11); Console.WriteLine("Time with set values: {0}", time);
Výstup programu potom vyzerá takto:
Konzolová aplikácia
Time with set values: 23:10
V poslednej ukážke týkajúcej sa vytvorenia inštancie si ukážeme, ako
vytvoriť štruktúru TimeOnly s aktuálnym časom
pomocou statickej metódy FromDateTime() štruktúry
TimeOnly:
TimeOnly currentTime = TimeOnly.FromDateTime(DateTime.Now);
Console.WriteLine("The current time is: {0}", currentTime);
Keďže štruktúra TimeOnly štruktúra neobsahuje
vlastnosť ani metódu pre tvorbu inštancie s aktuálnym časom, pomohli sme si
metódou FromDateTime(), ktorej sme odovzdali aktuálny dátum a
čas DateTime.Now.
Výstup programu potom vyzerá takto:
Konzolová aplikácia
The current time is: 12:26
Vlastnosti
Štruktúra TimeOnly má nasledujúce vlastnosti:
Hour- vráti hodnotu hodiny,Minute- vráti hodnotu minút,Second- vráti hodnotu sekúnd,Millisecond- vráti hodnotu milisekúnd,MicroSecond- vráti hodnotu microsekúnd,Ticks- vráti hodnotu ticks.
Prebrané vlastnosti si ukážeme v nasledujúcej ukážke:
TimeOnly sampleTime = new TimeOnly(22, 2, 2, 2, 2); Console.WriteLine("H: {0} M: {1} S: {2} MS: {3} MCS: {4} Ticks: {5}" ,sampleTime.Hour, sampleTime.Minute, sampleTime.Second, sampleTime.Millisecond, sampleTime.Microsecond, sampleTime.Ticks);
Výstup programu potom vyzerá takto:
Konzolová aplikácia
H: 22 M: 2 S: 2 MS: 2 MCS: 2 Ticks: 793220020020
Metódy
Teraz sa pozrime na metódy. Metódy nemenia inštanciu
TimeOnly, ale vracajú novú, v ktorej sú dané zmeny
vykonané.
Podobné metódy sme si prebrali pri štruktúre
TimeSpan v lekcii Dátum
a čas v C#.
Zmena vnútornej hodnoty
Rovnako ako u štruktúry DateTime, tak môžeme aj s
TimeOnly vnútornou hodnotou času 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. Na zmenu hodnoty teda slúžia metódy:
Add(),AddHours(),AddMinutes().
Metóda IsBetween()
TimeOnly inštancie štruktúry majú ešte jednu užitočnú
metódu IsBetween(). Táto metóda nám dokáže vyhodnotiť, či
čas zapadá do intervalu alebo nie. To by sme mohli napríklad
použiť na zistenie, či má obchod práve otvorené. Metódu
IsBetween() použijeme takto:
TimeOnly testedTime = new TimeOnly(22, 2, 2, 2, 2); TimeOnly startOfSearchInterval = new TimeOnly(21, 2, 2); TimeOnly endOfSearchInterval = new TimeOnly(1, 2, 2); Console.WriteLine("It's time '{0}' in the interval '{1}' - '{2}': {3}", testedTime, startOfSearchInterval, endOfSearchInterval, testedTime.IsBetween(startOfSearchInterval, endOfSearchInterval));
Výstup programu potom vyzerá takto:
Konzolová aplikácia
It's time '22:02' in the interval '21:02' - '01:02': True
Parsovanie
Rovnako ako sme si ukazovali parsovanie pri štruktúre DateOnly
funguje aj parsovanie pre TimeOnly. Opäť môžeme použiť
statické metódy Parse(), ako aj TryParse() na
štruktúre TimeOnly.
V najjednoduchšej podobe načítame čas takto:
Console.Write("Enter the time in the format HH:MM: "); TimeOnly timeFromUser = TimeOnly.Parse(Console.ReadLine()); Console.WriteLine("User entered this time: {0}", timeFromUser);
Výstup:
Konzolová aplikácia
Enter the time in the format HH:MM: 13:26
User entered this time: 13:26
Keď chceme zadávaný formát ovplyvniť, použijeme na to takzvaný pattern. Ten môže mať napr. nasledujúcu podobu:
string pattern = "H:m";
Viac o formátoch nájdeme v oficiálnej Microsoft dokumentácii.
Na parsovanie potom použijeme metódu ParseExact() a odovzdáme
jej náš pattern takto:
string pattern = "H:m"; Console.Write("Enter the time in the format {0}: ", pattern); TimeOnly timeByPattern = TimeOnly.ParseExact(Console.ReadLine(), pattern, null); Console.WriteLine("The user entered this time according to the pattern: {0}", timeByPattern);
Dostaneme tento výstup:
Konzolová aplikácia
Enter the time in the format H:m: 13:26
The user entered this time according to the pattern: 13:26
Popri ParseExact() môžeme použiť aj metódu
TryParseExact().
Prevod na text
Teraz sa pozrime na prevod času do textu, ktorý bude
užitočný pri výpise času. 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 čas v nami
požadovanom formáte:
string toStringPattern = "H:mm:ss"; TimeOnly sampleTimeForToString = new TimeOnly(22, 2, 2, 2, 2); Console.WriteLine("The time in the pattern {0} is: {1}", toStringPattern, sampleTimeForToString.ToString(toStringPattern));
Výpis:
Konzolová aplikácia
The time in the pattern H:mm:ss is: 22:02:02
Štruktúra TimeOnly má predpripravené pre výpis dátumu v
krátkom a dlhom formáte tieto metódy:
ToShortTimeString(),ToLongTimeString().
Štruktúru TimeOnly môžeme porovnávať pomocou
operátorov porovnania: > < ==.
V ďalšej lekcii, List, si ukážeme kolekciu, do ktorej je možné na rozdiel od poľa jednoducho pridávať a odoberať záznamy. 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é 9x (252.48 kB)
Aplikácia je vrátane zdrojových kódov v jazyku C#
