Lekce 12 - Datum a čas v C# - DateOnly a TimeOnly
V předešlém cvičení, Řešené úlohy k 11. lekci OOP v C# .NET, jsme si procvičili nabyté zkušenosti z předchozích lekcí.
V dnešním tutoriálu budeme pokračovat v práci s
datem a časem v C#. Představíme si struktury
DateOnly
a TimeOnly
. Vytvoříme několik ukázkových
programů.
Struktura DateOnly
Tato struktura slouží k uložení data bez časové
informace. Struktura DateOnly
nemá žádnou časovou
informaci, a proto datum reprezentuje od začátku až do konce dne. Takové
chování se nám může hodit například tehdy, chceme-li ukládat specifická
data. Takovými daty mohou být den narození, výročí nějaké události a
tak dále.
Oproti struktuře DateTime
má struktura DateOnly
tyto výhody:
DateTime
struktura může změnit datum na příští nebo předchozí den, pokud je na něj aplikovaná časová zóna. Toto se sDateOnly
stát nemůže.- Serializace struktury
DateTime
také zahrnuje časovou informaci, což může být v některých případech pro naše účely nežádoucí. DateTime
struktura také v porovnání sDateOnly
strukturou zabírá více místa v paměti.
Vytvoření instance
Nyní si ukážeme způsoby, jakými můžeme vytvořit instance struktury
DateOnly
. Nejprve si vytvoříme nový projekt
DateOnlyATimeOnly
, cílený na verzi .NET 7
nebo
vyšší.
Pozor! Struktury DateOnly
a
TimeOnly
jsou v plné funkčnosti dostupné pouze pro verzi .NET 7
a vyšší a Visual Studio 2022 verze 17.4 a vyšší.
Nyní si ukážeme, jak vytvořit DateOnly
pomocí volání
bezparametrického konstruktoru:
DateOnly vychoziDatum = new DateOnly(); Console.WriteLine("Výchozí datum: {0}",vychoziDatum);
Výstup programu vypadá následovně:
Konzolová aplikace
Výchozí datum: 01.01.0001
V následující ukázce se podíváme na to, jak vytvořit
DateOnly
strukturu s námi vybranými parametry:
DateOnly datum = new DateOnly(2023,10,11); Console.WriteLine("Datum s nastavenými hodnotami: {0}",datum);
Výstup programu vypadá následovně:
Konzolová aplikace
Datum s nastavenými hodnotami: 11.10.2023
V poslední ukázce týkající se vytvoření instance si ukážeme, jak
vytvořit DateOnly
strukturu s dnešním datem.
DateOnly
struktura neobsahuje vlastnost ani metodu, která by nám
vytvořila DateOnly
strukturu s dnešním datem. A proto musíme
následujícím způsobem použít statickou metodu FromDateTime()
ze struktury DateOnly
:
DateOnly dnesniDatum = DateOnly.FromDateTime(DateTime.Now);
Console.WriteLine("Dneska je: {0}",dnesniDatum);
Výstup programu vypadá následovně:
Konzolová aplikace
Dneska je: 13.10.2023
Vlastnosti
DateOnly
struktura má následující vlastnosti:
Day
– Vrací hodnotu dne.Month
– Vrací hodnotu měsíce.Year
– Vrací hodnotu roku.DayOfYear
– Vrací, kolikátý den v roce se daný datum nachází (hodnota je v rozmezí1
–366
).DayNumber
– Vrací počet dní od1. 1. 0001
podle gregoriánského kalendáře.DayOfWeek
– Vrací den v týdnuDayOfWeek
s hodnotou dne instance.
Probrané vlastnosti si ukážeme v následující ukázce:
DateOnly ukazkovyDatum = new DateOnly(2023, 10, 11); Console.WriteLine("Den v týdnu je {0} a číselně: {1}.", ukazkovyDatum.DayOfWeek, ukazkovyDatum.Day); Console.WriteLine("Je {0}. měsíc a rok {1}.", ukazkovyDatum.Month, ukazkovyDatum.Year); Console.WriteLine("Od počátku gregoriánského kalendáře uběhlo {0} dní. Je {1}. den roku.",ukazkovyDatum.DayNumber,ukazkovyDatum.DayOfYear);
Výstup programu vypadá následovně:
Konzolová aplikace
Dneska je: 13.10.2023
Den v týdnu je Wednesday a číselně 11.
Je 10. měsíc a rok 2023.
Od počátku gregoriánského kalendáře uběhlo 738803 dní. Je 284. den roku.
Metody
Nyní se podívejme na metody. Metody nemění instanci
DateOnly
, ale vracejí instanci novou, ve které jsou dané změny
provedeny.
Podobné metody jsme si probrali u struktury
DateTime
v lekci Datum a
čas v C#.
Změna vnitřní hodnoty
Stejně jako u struktury DateTime
můžeme i s
DateOnly
vnitřní hodnotou data velmi jednoduše manipulovat
pomocí metod, které přidávají různé časové úseky. Metody jako parametr
berou počet úseků (např. dní), které chceme přidat. Chceme-li úseky
naopak ubrat, použijeme zápornou hodnotu.
Za účelem změny vnitřní hodnoty máme k dispozici metody:
AddDays()
,AddMonths()
,AddYears()
.
Parsování
Parsování pro strukturu DateOnly
funguje stejně jako pro
strukturu DateTime
, které již známe. Opět můžeme použít
statické metody Parse()
i TryParse()
na struktuře
DateOnly
.
V nejjednodušší podobě načteme datum takto:
Console.Write("Zadejte datum ve formátu DD. MM. YYYY: "); DateOnly datumOdUzivatele = DateOnly.Parse(Console.ReadLine()); Console.WriteLine("Uživatel zadal tento datum: {0}", datumOdUzivatele);
Výstup:
Konzolová aplikace
Zadejte datum ve formátu DD. MM. YYYY: 13.10.2023
Uživatel zadal tento datum: 13.10.2023
Pokud chceme zadávaný formát ovlivnit, použijeme k tomu takzvaný pattern. Ten může mít např. následující podobu:
string pattern = "dd.M.yyyy";
Více o formátech nalezneme v oficiální Microsoft dokumentaci.
K parsování poté použijeme metodu ParseExact()
a předáme
jí náš pattern takto:
string patternDatum = "dd.M.yyyy"; Console.Write("Zadejte datum ve formátu {0}: ",patternDatum); DateOnly datumPodlePatternu = DateOnly.ParseExact(Console.ReadLine(), patternDatum, null); Console.WriteLine("Uživatel zadal tento datum podle patternu: {0}", datumPodlePatternu);
Dostaneme podobný výstup:
Konzolová aplikace
Zadejte datum ve formátu dd.M.yyyy: 13.10.2023
Uživatel zadal tento datum podle patternu: 13.10.2023
Vedle ParseExact()
můžeme použít i metodu
TryParseExact()
.
Převod na text
Pro strukturu DateOnly
máme formátování uvnitř volání
metody ToString()
. Následující ukázka nám vypíše do konzole
datum v požadovaném formátu:
DateOnly datumFormatovane = new DateOnly(2023, 10, 11); Console.WriteLine("Datum s formátem {0}",datumFormatovane.ToString("MMMM dd, yyyy"));
Výstup:
Konzolová aplikace
Datum s formátem října 11, 2023
Struktura DateOnly
má pro výpis data v
krátkém a dlouhém formátu
předpřipravené tyto metody:
ToShortDateString()
,ToLongDateString()
.
Strukturu DateOnly
můžeme porovnávat pomocí
operátorů porovnání: >
<
==
.
Struktura TimeOnly
Tato struktura reprezentuje hodnotu času jednoho dne.
Hodnota struktury TimeOnly
může být v intervalu
00:00:00.0000000
–23:59:59.9999999
. Oproti struktuře
TimeSpan
má struktura TimeOnly
tyto výhody:
- Struktura
TimeSpan
reprezentuje nějaký časový interval, jako například čas naměřený na stopkách. Hodnota intervalu může být i záporná. To indikuje, že se vracíme v čase, což ale v kontextu indikace specifického času nějakého dne nedává smysl. - Při použití struktury
TimeSpan
jako časové hodnoty dne existuje riziko manipulace její hodnoty, která by tak mohla být vyšší než 24 hodin. To se u strukturyTimeOnly
stát nemůže. TimeOnly
také zabírá méně místa v paměti nežTimeSpan
.
Vytvoření instance
Instanci struktury TimeOnly
můžeme vytvořit voláním
bezparametrického konstruktoru takto:
TimeOnly vychoziCas = new TimeOnly(); Console.WriteLine("Výchozí čas: {0}",vychoziCas);
Výstup programu vypadá následovně:
Konzolová aplikace
Výchozí čas: 0:00
Instanci struktury TimeOnly
můžeme vytvořit i s námi
vybranými parametry v jejím konstruktoru:
TimeOnly cas = new TimeOnly(23,10,11); Console.WriteLine("Čas s nastavenými hodnotami: {0}",cas);
Výstup programu poté vypadá takto:
Konzolová aplikace
Čas s nastavenými hodnotami: 23:10
V poslední ukázce týkající se vytvoření instance si ukážeme, jak
vytvořit TimeOnly
strukturu s aktuálním časem
pomocí statické metody FromDateTime()
struktury
TimeOnly
:
TimeOnly aktualniCas = TimeOnly.FromDateTime(DateTime.Now);
Console.WriteLine("Aktuální čas je: {0}",aktualniCas);
Jelikož TimeOnly
struktura neobsahuje vlastnost
ani metodu pro tvorbu instance s aktuálním časem, pomohli jsme si metodou
FromDateTime()
, které jsme předali aktuální datum a čas
DateTime.Now
.
Výstup programu poté vypadá takto:
Konzolová aplikace
Aktuální čas je: 0:31
Vlastnosti
TimeOnly
struktura má následující vlastnosti:
Hour
– Vrátí hodnotu hodiny.Minute
– Vrátí hodnotu minut.Second
– Vrátí hodnotu sekund.Millisecond
– Vrátí hodnotu milisekund.MicroSecond
– Vrátí hodnotu mikrosekund.Ticks
– Vrátí hodnotu ticks.
Probrané vlastnosti si předvedeme v následující ukázce:
TimeOnly ukazkovyCas = new TimeOnly(22,2,2,2,2); Console.WriteLine("H: {0} M: {1} S: {2} MS: {3} MCS: {4} Ticks: {5}" ,ukazkovyCas.Hour, ukazkovyCas.Minute, ukazkovyCas.Second, ukazkovyCas.Millisecond, ukazkovyCas.Microsecond, ukazkovyCas.Ticks);
Výstup programu poté vypadá takto:
Konzolová aplikace
H: 22 M: 2 S: 2 MS: 2 MCS: 2 Ticks: 793220020020
Metody
Nyní se podívejme na metody. Metody nemění instanci
TimeOnly
, ale vrací instanci novou, ve které jsou dané změny
provedeny.
Podobné metody jsme si probrali u struktury
TimeSpan
v lekci Datum
a čas v C#.
Změna vnitřní hodnoty
Stejně jako u struktury DateTime
můžeme i s
TimeOnly
vnitřní hodnotou času velmi jednoduše manipulovat
pomocí metod, které přidávají různé časové
úseky. Metody jako parametr berou počet úseků
(např. dní), které chceme přidat. Chceme-li úseky naopak ubrat, použijeme
zápornou hodnotu. Za účelem změny vnitřní hodnoty tedy slouží
metody:
Add()
,AddHours()
,AddMinutes()
.
Metoda IsBetween()
TimeOnly
instance struktury mají ještě jednu užitečnou
metodu IsBetween()
. Tato metoda nám dokáže vyhodnotit, zda čas
zapadá do intervalu, nebo nikoli. To bychom mohli použít
například ke zjištění, zda má obchod právě otevřeno. Metodu
IsBetween()
použijeme takto:
TimeOnly testovanyCas = new TimeOnly(22,2,2,2,2); TimeOnly zacatekHledanehoIntervalu = new TimeOnly(21,2,2); TimeOnly konecHledanehoIntervalu = new TimeOnly(1,2,2); Console.WriteLine("Je čas '{0}' v intervalu '{1}' - '{2}': {3}", testovanyCas, zacatekHledanehoIntervalu, konecHledanehoIntervalu, testovanyCas.IsBetween(zacatekHledanehoIntervalu,konecHledanehoIntervalu));
Výstup programu poté vypadá takto:
Konzolová aplikace
Je čas 22:02 v intervalu 21:02 - 1:02: True
Parsování
Parsování pro strukturu TimeOnly
funguje stejně jako pro
strukturu DateOnly
. Opět můžeme použít statické metody
Parse()
i TryParse()
na struktuře
TimeOnly
.
V nejjednodušší podobě načteme datum takto:
Console.Write("Zadejte čas ve formátu HH:MM: "); TimeOnly casOdUzivatele = TimeOnly.Parse(Console.ReadLine()); Console.WriteLine("Uživatel zadal tento čas: {0}", casOdUzivatele);
Výstup:
Konzolová aplikace
Zadejte čas ve formátu HH:MM: 13:26
Uživatel zadal tento čas: 13:26
Pokud chceme zadávaný formát ovlivnit, použijeme k tomu takzvaný pattern. Ten může mít např. následující podobu:
string pattern = "H:m";
Více o formátech nalezneme v oficiální Microsoft dokumentaci.
K parsování poté použijeme metodu ParseExact()
a předáme
jí náš pattern takto:
string pattern = "H:m"; Console.Write("Zadejte čas ve formátu {0}: ",pattern); TimeOnly casPodlePatternu = TimeOnly.ParseExact(Console.ReadLine(), pattern, null); Console.WriteLine("Uživatel zadal tento čas podle patternu: {0}", casPodlePatternu);
Dostaneme tento výstup:
Konzolová aplikace
Zadejte čas ve formátu H:m: 13:26
Uživatel zadal tento čas podle patternu: 13:26
Vedle ParseExact()
můžeme použít i metodu
TryParseExact()
.
Převod na text
Nyní se podívejme na převod času do textu, který nám
bude užitečný při výpisu času. Samozřejmě funguje metoda
ToString()
, která je bez parametrů a C# ji volá implicitně.
Metodě můžeme dát jako parametr pattern, aby vrátila čas v námi
požadovaném formátu:
string patternProToString = "H:mm:ss"; TimeOnly ukazkovyCasProToString = new TimeOnly(22,2,2,2,2); Console.WriteLine("Čas podle patternu {0} je:{1}",patternProToString,ukazkovyCasProToString.ToString(patternProToString));
Výpis:
Konzolová aplikace
Čas podle patternu H:mm:ss je: 22:02:02
Struktura TimeOnly
má pro výpis data v
krátkém a dlouhém formátu
předpřipravené tyto metody:
ToShortTimeString()
,ToLongTimeString()
.
Strukturu TimeOnly
můžeme porovnávat pomocí
operátorů porovnání: >
<
==
.
V příští lekci, List, si ukážeme kolekci, do které lze na rozdíl od pole jednoduše přidávat záznamy a také je odebírat. Vytvoříme si jednoduchou databázi.
Měl jsi s čímkoli problém? Stáhni si vzorovou aplikaci níže a porovnej ji se svým projektem, chybu tak snadno najdeš.
Stáhnout
Stažením následujícího souboru souhlasíš s licenčními podmínkami
Staženo 57x (186.38 kB)
Aplikace je včetně zdrojových kódů v jazyce C#