Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

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 s DateOnly 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í s DateOnly 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í od 1. 1. 0001 podle Gregoriánského kalendáře,
  • DayOfWeek - vrací den v týdnu DayOfWeek 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 struktury TimeOnly stát nemůže.
  • TimeOnly struktura oproti TimeSpan 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#

 

Předchozí článek
Řešené úlohy k 11. lekci OOP v C# .NET
Všechny články v sekci
Objektově orientované programování v C# .NET
Přeskočit článek
(nedoporučujeme)
List
Článek pro vás napsal Petr Malečík
Avatar
Uživatelské hodnocení:
108 hlasů
Zajímám se o technologie na platformě .NET. Nejradši mám vývoj v Back-Endu ať už se jedná o REST API a nebo GraphQL.
Aktivity