12. diel - Dátum a čas v C# - DateOnly a TimeOnly
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.
Teraz si ukážeme spôsoby akými môžeme vytvoriť inštancie štruktúry
DateOnly
. Najprv si vytvoríme nový projekt
DateOnlyATimeOnly
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:
Výstup programu vyzerá nasledovne:
V nasledujúcej ukážke sa
pozrieme na to, ako vytvoriť DateOnly
štruktúru s nami
vybranými parametrami:
Výstup programu vyzerá nasledovne:
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:
Výstup programu vyzerá nasledovne:
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.
Výstup programu vyzerá nasledovne:
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()
.
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:
Výstup:
Keď chceme zadávaný formát ovplyvniť, použijeme na to takzvaný pattern. Ten môže mať napr. nasledujúcu podobu:
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:
Dostaneme podobný výstup:
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:
Výstup:
Štruktúra
DateOnly
má predpripravené pre výpis dáta v
krátkom a dlhom formáte tieto metódy:
ToShortDateString()
ToLongDateString()
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.
Inštanciu štruktúry TimeOnly
môžeme vytvoriť volaním
bezparametrického konštruktora takto:
Výstup programu vyzerá nasledovne:
Inštanciu štruktúry
TimeOnly
môžeme vytvoriť aj s nami vybranými parametrami v jej
konštruktore:
Výstup programu potom vyzerá takto:
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
:
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:
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.
Výstup programu potom vyzerá takto:
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()
.
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:
Výstup programu potom vyzerá takto:
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 dátum takto:
Výstup:
Keď chceme zadávaný formát ovplyvniť, použijeme na to takzvaný pattern. Ten môže mať napr. nasledujúcu podobu:
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:
Dostaneme tento výstup:
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:
Výpis:
Štruktúra
TimeOnly
má predpripravené pre výpis dáta v
krátkom a dlhom formáte tieto metódy:
ToShorTimeString()
ToLongTimeString()
TimeOnly
môžeme porovnávať pomocou operátorov
porovnania: >
<
==
.
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é 37x (186.38 kB)
Aplikácia je vrátane zdrojových kódov v jazyku C#