IT rekvalifikácia. Seniorní programátori zarábajú až 6 000 €/mesiac a rekvalifikácia je prvým krokom. Zisti, ako na to!

12. diel - Dátum a čas v C# - DateOnly a TimeOnly

V predchádzajúcom cvičení, Riešené úlohy k 11. lekcii OOP v C# .NET, sme si precvičili získané skúsenosti z predchádzajúcich lekcií.

V dnešnom tutoriále budeme pokračovať v práci s dátumom a časom v C#. Predstavíme si štruktúry DateOnly a TimeOnly. Vytvoríme niekoľko ukážkových programov.

Štruktúra DateOnly

Táto štruktúra slúži na uloženie dátumu bez časovej informácie. Štruktúra DateOnly nemá žiadnu časovú informáciu, a preto reprezentuje dátum od začiatku až do konca dňa. Také správanie sa nám napríklad môže hodiť, ak chceme ukladať špecifické dáta. Takými dátami môžu byť deň narodenia, výročia nejakej udalosti a tak ďalej.

Oproti štruktúre DateTime má štruktúra DateOnly tieto výhody:

  • DateTime štruktúra môže zmeniť dátum na budúci alebo predchádzajúci deň, ak je naň aplikovaná časová zóna. Toto sa s DateOnly stať nemôže.
  • Serializácia štruktúry DateTime tiež zahŕňa časovú informáciu, čo môže byť v nejakých prípadoch na naše účely nežiaduce.
  • DateTime štruktúra v pamäti zaberá viac miesta v porovnaní s DateOnly štruktúrou.

Vytvorenie inštancie

Teraz si ukážeme spôsoby akými môžeme vytvoriť inštancie štruktúry DateOnly. Najprv si vytvoríme nový projekt DateOnly_TimeOnly cielený na verziu .NET 7 alebo vyššiu.

Pozor! Štruktúry DateOnly a TimeOnly sú v plnej funkčnosti dostupné iba pre verziu .NET 7 a vyššiu a Visual Studio 2022 verzie 17.4 a vyššiu.

Teraz si ukážeme, ako vytvoriť DateOnly pomôcť volaní bezparametrického konštruktora:

DateOnly defaultDate = new DateOnly();
Console.WriteLine("Default date: {0}", defaultDate);

Výstup programu vyzerá nasledovne:

Konzolová aplikácia
Default date: 01.01.0001

V nasledujúcej ukážke sa pozrieme na to, ako vytvoriť DateOnly štruktúru s nami vybranými parametrami:

DateOnly date = new DateOnly(2023, 10, 11);
Console.WriteLine("Date with preset values: {0}", date);

Výstup programu vyzerá nasledovne:

Konzolová aplikácia
Date with preset values: 11.10.2023

V poslednej ukážke týkajúcej sa vytvorenia inštancie si ukážeme, ako vytvoriť DateOnly štruktúru s dnešným dátumom. DateOnly štruktúra neobsahuje vlastnosť, alebo metódu, ktorá by nám vytvorila DateOnly štruktúru s dnešným dátumom. A preto musíme použiť statickú metódu FromDateTime() zo štruktúry DateOnly nasledujúcim spôsobom:

DateOnly todayDate = DateOnly.FromDateTime(DateTime.Now);
Console.WriteLine("Today is: {0}", todayDate);

Výstup programu vyzerá nasledovne:

Konzolová aplikácia
Today is: 13.10.2023

Vlastnosti

DateOnly štruktúra má nasledujúce vlastnosti:

  • Day - vracia hodnotu dňa,
  • Month - vracia hodnotu mesiaca,
  • Year - vracia hodnotu roka,
  • DayOfYear - vracia, koľký deň v roku sa daný dátum nachádza (hodnota je v rozmedzí 1 - 366),
  • DayNumber - vracia počet dní od 1. 1. 0001 podľa Gregoriánskeho kalendára,
  • DayOfWeek - vracia deň v týždni DayOfWeek s hodnotou dňa inštancie.

Prebrané vlastnosti si ukážeme v nasledujúcej ukážke:

DateOnly exampleDate = new DateOnly(2023, 10, 11);
Console.WriteLine("The day of the week is {0} and numerically: {1}.", exampleDate.DayOfWeek, exampleDate.Day);
Console.WriteLine("It is {0} month and year {1}.", exampleDate.Month, exampleDate.Year);
Console.WriteLine("It has passed since the beginning of the Gregorian calendar {0} days. It is {1} day of the year.", exampleDate.DayNumber, exampleDate.DayOfYear);

Výstup programu vyzerá nasledovne:

Konzolová aplikácia
The day of the week is Wednesday and numerically: 11.
It is 10 month and year 2023.
It has passed since the beginning of the Gregorian calendar 738803 days. It is 284 day of the year.

Metódy

Teraz sa pozrime na metódy. Metódy nemenia inštanciu DateOnly, ale vracajú novú, v ktorej sú dané zmeny vykonané.

Podobné metódy sme si prebrali pri štruktúre DateTime v lekcii Dátum a čas v C#.

Zmena vnútornej hodnoty

Rovnako ako pri štruktúre DateTime, tak aj pri DateOnly môžeme s vnútornou hodnotou dáta veľmi jednoducho manipulovať pomocou metód, ktoré pridávajú rôzne časové úseky. Ako parameter berú počet úsekov (napr. dní), ktoré chceme pridať. Ak ich chceme naopak ubrať, použijeme zápornú hodnotu.

Za účelom zmeny vnútornej hodnoty máme k dispozícii metódy:

  • AddDays(),
  • AddMonths(),
  • AddYears().

Parsovanie

Rovnako ako sme si ukazovali parsovanie pre štruktúru DateTime, funguje parsovanie aj pre štruktúru DateOnly. Opäť môžeme použiť statické metódy Parse(), ako aj TryParse() na štruktúre DateOnly.

V najjednoduchšej podobe načítame dátum takto:

Console.Write("Enter the date in the format DD. MM. YYYY: ");
DateOnly dateFromUser = DateOnly.Parse(Console.ReadLine());
Console.WriteLine("User entered this date: {0}", dateFromUser);

Výstup:

Konzolová aplikácia
Enter the date in the format DD. MM. YYYY: 13.10.2023
User entered this date: 13.10.2023

Keď chceme zadávaný formát ovplyvniť, použijeme na to takzvaný pattern. Ten môže mať napr. nasledujúcu podobu:

string datePattern = "dd.M.yyyy";

Viac o formátoch nájdeme v oficiálnej Microsoft dokumentácii.

Na parsovanie potom použijeme metódu ParseExact() a odovzdáme jej náš pattern takto:

string datePattern = "dd.M.yyyy";
Console.Write("Enter the date in the format {0}: ", datePattern);
DateOnly dateByPattern = DateOnly.ParseExact(Console.ReadLine(), datePattern, null);
Console.WriteLine("The user entered this date according to the pattern: {0}", dateByPattern);

Dostaneme podobný výstup:

Konzolová aplikácia
Enter the date in the format dd.M.yyyy: 13.10.2023
The user entered this date according to the pattern: 13.10.2023

Popri ParseExact() môžeme použiť aj metódu TryParseExact().

Prevod na text

Pre štruktúru DateOnly máme formátovanie vo vnútri volania metódy ToString(). Nasledujúca ukážka nám vypíše do konzoly dátum v požadovanom formáte:

DateOnly formattedDate = new DateOnly(2023, 10, 11);
Console.WriteLine("Date with the format {0}", formattedDate.ToString("MMMM dd, yyyy"));

Výstup:

Konzolová aplikácia
Date with the format October 11, 2023

Štruktúra DateOnly má predpripravené pre výpis dáta v krátkom a dlhom formáte tieto metódy:

  • ToShortDateString(),
  • ToLongDateString().

Štruktúru DateOnly môžeme porovnávať pomocou operátorov porovnania: > < ==.

Štruktúra TimeOnly

Táto štruktúra reprezentuje hodnotu času jedného dňa. Hodnota štruktúry TimeOnly môže byť v intervale 00:00:00.0000000 - 23:59:59.9999999. Oproti štruktúre TimeSpan má štruktúra TimeOnly tieto výhody:

  • Štruktúra TimeSpan reprezentuje nejaký časový interval, ako napríklad čas nameraný na stopkách. Jeho hodnota môže byť aj záporná. To indikuje, že sa vraciame v čase, čo ale v kontexte indikácie špecifického času nejakého dňa nedáva zmysel.
  • Pri použití štruktúry TimeSpan ako časovej hodnoty dňa existuje riziko manipulácie jej hodnoty, ktorá tak by mohla byť vyššia ako 24 hodín. To sa pri štruktúre TimeOnly stať nemôže.
  • TimeOnly štruktúra oproti TimeSpan zaberá menej miesta v pamäti.

Vytvorenie inštancie

Inštanciu štruktúry TimeOnly môžeme vytvoriť volaním bezparametrického konštruktora takto:

TimeOnly defaultTime = new TimeOnly();
Console.WriteLine("Default time: {0}", defaultTime);

Výstup programu vyzerá nasledovne:

Konzolová aplikácia
Default time: 00:00

Inštanciu štruktúry TimeOnly môžeme vytvoriť aj s nami vybranými parametrami v jej konštruktore:

TimeOnly time = new TimeOnly(23, 10, 11);
Console.WriteLine("Time with set values: {0}", time);

Výstup programu potom vyzerá takto:

Konzolová aplikácia
Time with set values: 23:10

V poslednej ukážke týkajúcej sa vytvorenia inštancie si ukážeme, ako vytvoriť TimeOnly štruktúru s aktuálnym časom pomocou statickej metódy FromDateTime() štruktúry TimeOnly:

TimeOnly currentTime = TimeOnly.FromDateTime(DateTime.Now);
Console.WriteLine("The current time is: {0}", currentTime);

Keďže TimeOnly štruktúra neobsahuje vlastnosť ani metódu pre tvorbu inštancie s aktuálnym časom, pomohli sme si metódou FromDateTime(), ktoré sme odovzdali aktuálny dátum a čas DateTime.Now.

Výstup programu potom vyzerá takto:

Konzolová aplikácia
The current time is: 12:26

Vlastnosti

TimeOnly štruktúra má nasledujúce vlastnosti:

  • Hour - vráti hodnotu hodiny,
  • Minute - vráti hodnotu minút,
  • Second - vráti hodnotu sekúnd,
  • Millisecond - vráti hodnotu milisekúnd,
  • MicroSecond - vráti hodnotu microsekúnd,
  • Ticks - vráti hodnotu ticks.

Prebrané vlastnosti si ukážeme v nasledujúcej ukážke:

TimeOnly sampleTime = new TimeOnly(22, 2, 2, 2, 2);
Console.WriteLine("H: {0} M: {1} S: {2} MS: {3} MCS: {4} Ticks: {5}" ,sampleTime.Hour,
                                                                      sampleTime.Minute,
                                                                      sampleTime.Second,
                                                                      sampleTime.Millisecond,
                                                                      sampleTime.Microsecond,
                                                                      sampleTime.Ticks);

Výstup programu potom vyzerá takto:

Konzolová aplikácia
H: 22 M: 2 S: 2 MS: 2 MCS: 2 Ticks: 793220020020

Metódy

Teraz sa pozrime na metódy. Metódy nemenia inštanciu TimeOnly, ale vracajú novú, v ktorej sú dané zmeny vykonané.

Podobné metódy sme si prebrali pri štruktúre TimeSpan v lekcii Dátum a čas v C#.

Zmena vnútornej hodnoty

Rovnako ako u štruktúry DateTime, tak aj s TimeOnly vnútornou hodnotou času môžeme veľmi jednoducho manipulovať pomocou metód, ktoré pridávajú rôzne časové úseky. Ako parameter berú počet úsekov (napr. dní), ktoré chceme pridať. Ak ich chceme naopak ubrať, použijeme zápornú hodnotu. Za účelom zmeny hodnoty teda slúžia metódy:

  • Add(),
  • AddHours(),
  • AddMinutes().

Metóda IsBetween()

TimeOnly inštancie štruktúry ešte majú jednu užitočnú metódu IsBetween(). Táto metóda nám dokáže vyhodnotiť, či čas zapadá do intervalu alebo nie. To by sme mohli napríklad použiť na zistenie, či má obchod práve otvorené. Metódu IsBetween() použijeme takto:

TimeOnly testedTime = new TimeOnly(22, 2, 2, 2, 2);
TimeOnly startOfSearchInterval = new TimeOnly(21, 2, 2);
TimeOnly endOfSearchInterval = new TimeOnly(1, 2, 2);

Console.WriteLine("It's time '{0}' in the interval '{1}' - '{2}': {3}",
                                                    testedTime,
                                                    startOfSearchInterval,
                                                    endOfSearchInterval,
                                                    testedTime.IsBetween(startOfSearchInterval, endOfSearchInterval));

Výstup programu potom vyzerá takto:

Konzolová aplikácia
It's time '22:02' in the interval '21:02' - '01:02': True

Parsovanie

Rovnako ako sme si ukazovali parsovanie pri štruktúre DateOnly funguje aj parsovanie pre TimeOnly. Opäť môžeme použiť statické metódy Parse(), ako aj TryParse() na štruktúre TimeOnly.

V najjednoduchšej podobe načítame čas takto:

Console.Write("Enter the time in the format HH:MM: ");
TimeOnly timeFromUser = TimeOnly.Parse(Console.ReadLine());
Console.WriteLine("User entered this time: {0}", timeFromUser);

Výstup:

Konzolová aplikácia
Enter the time in the format HH:MM: 13:26
User entered this time: 13:26

Keď chceme zadávaný formát ovplyvniť, použijeme na to takzvaný pattern. Ten môže mať napr. nasledujúcu podobu:

string pattern = "H:m";

Viac o formátoch nájdeme v oficiálnej Microsoft dokumentácii.

Na parsovanie potom použijeme metódu ParseExact() a odovzdáme jej náš pattern takto:

string pattern = "H:m";
Console.Write("Enter the time in the format {0}: ", pattern);
TimeOnly timeByPattern = TimeOnly.ParseExact(Console.ReadLine(), pattern, null);
Console.WriteLine("The user entered this time according to the pattern: {0}", timeByPattern);

Dostaneme tento výstup:

Konzolová aplikácia
Enter the time in the format H:m: 13:26
The user entered this time according to the pattern: 13:26

Popri ParseExact() môžeme použiť aj metódu TryParseExact().

Prevod na text

Teraz sa pozrime na prevod času do textu, ktorý nám bude užitočný pri výpise času. Samozrejme funguje metóda ToString(), ktorá je bez parametrov a C# ju volá implicitne. Metóde môžeme dať ako parameter pattern, aby vrátila čas v nami požadovanom formáte:

string toStringPattern = "H:mm:ss";
TimeOnly sampleTimeForToString = new TimeOnly(22, 2, 2, 2, 2);
Console.WriteLine("The time in the pattern {0} is: {1}", toStringPattern, sampleTimeForToString.ToString(toStringPattern));

Výpis:

Konzolová aplikácia
The time in the pattern H:mm:ss is: 22:02:02

Štruktúra TimeOnly má predpripravené pre výpis dáta v krátkom a dlhom formáte tieto metódy:

  • ToShortTimeString(),
  • ToLongTimeString().

Štruktúru TimeOnly môžeme porovnávať pomocou operátorov porovnania: > < ==.

V budúcej lekcii, List, si ukážeme kolekciu, do ktorej je možné na rozdiel od poľa jednoducho pridávať a odoberať záznamy. Vytvoríme si jednoduchú databázu.


 

Mal si s čímkoľvek problém? Stiahni si vzorovú aplikáciu nižšie a porovnaj ju so svojím projektom, chybu tak ľahko nájdeš.

Stiahnuť

Stiahnutím nasledujúceho súboru súhlasíš s licenčnými podmienkami

Stiahnuté 3x (252.63 kB)
Aplikácia je vrátane zdrojových kódov v jazyku C#

 

Predchádzajúci článok
Riešené úlohy k 11. lekcii OOP v C# .NET
Všetky články v sekcii
Objektovo orientované programovanie v C# .NET
Preskočiť článok
(neodporúčame)
List
Článok pre vás napísal Petr Malečík
Avatar
Užívateľské hodnotenie:
Ešte nikto nehodnotil, buď prvý!
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