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ží pro uložení data bez časové
informace. Struktura DateOnly
nemá žádnou časovou
informaci, a proto reprezentuje datum od začátku až do konce dne. Takové
chování se nám například může hodit, pokud chceme ukládat specifická
data. Takovými daty mohou být den narození, výročí nějaké události a
tak dále.
Oproti struktury 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ějakých případech pro naše účely nežádoucí. DateTime
struktura v paměti zabírá více místa v porovnání sDateOnly
strukturou.
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
pomoci voláni
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, nebo metodu, která by
nám vytvořila DateOnly
strukturu s dnešním datem. A proto
musíme použít statickou metodu FromDateTime()
ze struktury
DateOnly
následující způsobem:
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 roku 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 vrací 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
, tak i u DateOnly
můžeme s vnitřní hodnotou data velmi jednoduše manipulovat pomocí metod,
které přidávají různé časové úseky. Jako parametr berou počet úseků
(např. dní), které chceme přidat. Pokud je chceme naopak ubrat, použijeme
zápornou hodnotu.
Za účelem změny vnitřní hodnoty máme k dispozici metody:
AddDays()
,AddMonths()
,AddYears()
.
Parsování
Stejně jako jsme si ukazovali parsování pro strukturu
DateTime
, funguje parsování i pro strukturu
DateOnly
. Opět můžeme použít statické metody
Parse()
, tak 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
Když chceme zadávaný formát ovlivnit, použijeme k tomu tak zvaný 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á předpřipravené pro výpis data v
krátkém a dlouhém formátu 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 struktury
TimeSpan
má struktura TimeOnly
tyto výhody:
- Struktura
TimeSpan
reprezentuje nějaký časový interval, jako například čas naměřený na stopkách. Jeho hodnota 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á tak by mohla být vyšší než 24 hodin. To se u strukturyTimeOnly
stát nemůže. TimeOnly
struktura oprotiTimeSpan
zabírá méně místa v paměti.
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 microsekund,Ticks
- vrátí hodnotu ticks.
Probrané vlastnosti si ukážeme 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í 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
, tak i s TimeOnly
vnitřní hodnotou času můžeme velmi jednoduše manipulovat pomocí metod,
které přidávají různé časové úseky.
Jako parametr berou počet úseků (např. dní), které chceme
přidat. Pokud je chceme naopak ubrat, použijeme zápornou hodnotu. Za účelem
změny hodnoty tedy slouží metody:
Add()
,AddHours()
,AddMinutes()
.
Metoda IsBetween()
TimeOnly
instance struktury ještě mají jednu užitečnou
metodu IsBetween()
. Tato metoda nám dokáže vyhodnotit, jestli
čas zapadá do intervalu nebo nikoliv. To bychom mohli
například použít k zjištění, jestli 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í
Stejně jako jsme si ukazovali parsování u struktury DateOnly
funguje i parsování pro TimeOnly
. Opět můžeme použít
statické metody Parse()
, tak 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
Když 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á předpřipravené pro výpis data v
krátkém a dlouhém formátu 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 a odebírat záznamy. 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 37x (186.38 kB)
Aplikace je včetně zdrojových kódů v jazyce C#