12. diel - Dátum a čas v C# - DateOnly a TimeOnly
V predchádzajúcom cvičení, Riešené úlohy k 11. lekcii OOP v C# .NET, sme si precvičili získané skúsenosti z predchádzajúcich lekcií.
V dnešnom tutoriále 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 reprezentuje 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:
DateTime
štruktúra môže zmeniť dátum na budúci alebo predchádzajúci deň, ak je naň aplikovaná časová zóna. Toto sa sDateOnly
stať nemôže.- Serializácia štruktúry
DateTime
tiež zahŕňa časovú informáciu, čo môže byť v nejakých prípadoch na naše účely nežiaduce. DateTime
štruktúra v pamäti zaberá viac miesta v porovnaní sDateOnly
š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 verzie 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á nasledovne:
Konzolová aplikácia
Default date: 01.01.0001
V nasledujúcej ukážke sa pozrieme na to, ako vytvoriť
DateOnly
štruktúru s nami vybranými parametrami:
DateOnly date = new DateOnly(2023, 10, 11); Console.WriteLine("Date with preset values: {0}", date);
Výstup programu vyzerá nasledovne:
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á nasledovne:
Konzolová aplikácia
Today is: 13.10.2023
Vlastnosti
DateOnly
štruktúra má nasledujúce vlastnosti:
Day
- vracia hodnotu dňa,Month
- vracia hodnotu mesiaca,Year
- vracia hodnotu roka,DayOfYear
- vracia, koľký deň v roku sa daný dátum nachádza (hodnota je v rozmedzí1
-366
),DayNumber
- vracia počet dní od1. 1. 0001
podľa Gregoriánskeho kalendára,DayOfWeek
- vracia deň v týždniDayOfWeek
s 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á nasledovne:
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.
Za účelom zmeny 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áta 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 reprezentuje 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
TimeSpan
reprezentuje 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
TimeSpan
ako č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úreTimeOnly
stať nemôže. TimeOnly
štruktúra oprotiTimeSpan
zaberá 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á nasledovne:
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ť TimeOnly
štruktúru 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 TimeOnly
štruktúra neobsahuje vlastnosť
ani metódu pre tvorbu inštancie s aktuálnym časom, pomohli sme si metódou
FromDateTime()
, ktoré 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
TimeOnly
štruktúra 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 aj s
TimeOnly
vnútornou hodnotou č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:
Add()
,AddHours()
,AddMinutes()
.
Metóda IsBetween()
TimeOnly
inštancie štruktúry ešte majú 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ý nám 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áta v
krátkom a dlhom formáte tieto metódy:
ToShortTimeString()
,ToLongTimeString()
.
Štruktúru TimeOnly
môžeme porovnávať pomocou
operátorov porovnania: >
<
==
.
V budúcej 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é 3x (252.63 kB)
Aplikácia je vrátane zdrojových kódov v jazyku C#