Lekce 14 - Datum a čas v C# - DateOnly a TimeOnly
V předešlém cvičení, Řešené úlohy k 13. 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:
DateTimestruktura může změnit datum na příští nebo předchozí den, pokud je na něj aplikovaná časová zóna. Toto se sDateOnlystát nemůže.- Serializace struktury
DateTimetaké zahrnuje časovou informaci, což může být v některých případech pro naše účely nežádoucí. DateTimestruktura také v porovnání sDateOnlystrukturou 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. 0001podle gregoriánského kalendáře.DayOfWeek– Vrací den v týdnuDayOfWeeks 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
TimeSpanreprezentuje 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
TimeSpanjako časové hodnoty dne existuje riziko manipulace její hodnoty, která by tak mohla být vyšší než 24 hodin. To se u strukturyTimeOnlystát nemůže. TimeOnlytaké 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 77x (186.38 kB)
Aplikace je včetně zdrojových kódů v jazyce C#
