NOVINKA - Online rekvalifikační kurz Java programátor. Oblíbená a studenty ověřená rekvalifikace - nyní i online.
NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!

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 s DateOnly 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í s DateOnly 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í 1366).
  • 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 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.000000023: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 struktury TimeOnly 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#

 

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í:
177 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