TOC

This article has been localized into Czech by the community.

Datové typy:

Práce s datem a časem

C# má skvělou strukturu pro práci s daty a časem - nazývá se DateTime. Ve skutečnosti to není datový typ, ale zařadil jsem ho do této kapitoly, protože často budete pracovat s daty a/nebo časem pomocí struktury DateTime - někdy právě tolik, jako pracujete s řetězci a čísly.

Začněme vytvořením nového objektu DateTime:

DateTime dt = new DateTime();
Console.WriteLine(dt.ToString());

Výsledek je ale docela nudný: 01-01-0001 00:00:00. To odpovídá poli DateTime.MinValue, ale DateTime má další pomocné vlastnosti - nejzajímavější je DateTime.Now:

DateTime dt = DateTime.Now;
Console.WriteLine(dt.ToString());

To nám dá aktuální datum a čas, což je často velmi relevantní - uvidíme to v některých z nadcházejících příkladů. V mnoha situacích však pravděpodobně chcete reprezentovat konkrétní datum a čas - naštěstí pro nás má DateTime několik konstruktorů, které nám s tím právě pomohou. Zde je příklad:

DateTime dt = new DateTime(2042, 12, 24);
Console.WriteLine(dt.ToString());

Pořadí parametrů v tomto konstruktoru je Rok, Měsíc, Den, takže toto nám dá objekt DateTime s datem reprezentujícím Štědrý den v roce 2042.

DateTime - s časem nebo bez?

A co čas? Pokud žádný nespecifikujete, bude výchozí hodnota 00:00:00, jak můžete vidět z našeho předchozího příkladu. Čas můžete snadno specifikovat také:

DateTime dt = new DateTime(2042, 12, 24, 18, 42, 0);
Console.WriteLine(dt.ToString());

Nyní má DateTime také čas, v tomto případě v 18:42. Všimněte si, že hodiny by měly být specifikovány jako číslo mezi 0 a 23, protože pro vstup používáme 24hodinový formát, ale nebojte se, pokud ho chcete ve 12hodinovém formátu s AM/PM - to lze snadno udělat ve výstupu, jak probereme později.

Zbývající otázka zní: Co dělat, pokud vás zajímá pouze část s datem? Zřejmá odpověď by byla použít třídu Date místo třídy DateTime, ale ve skutečnosti nic takového neexistuje. Místo toho má třída DateTime vlastnost Date:

DateTime dt = new DateTime(2042, 12, 24, 18, 42, 0);
DateTime date = dt.Date;
Console.WriteLine(date.ToString());

Jak však uvidíte, vlastnost Date je také objekt DateTime, kde část s časem byla nastavena na 00:00:00. To může být trochu matoucí, ale dává to také dobrý smysl, protože DateTime by měl vždy sloužit jen jako kontejner, který drží data, která můžete uživateli vypsat mnoha způsoby a formami. Již jsme použili základní metodu ToString(), ale existuje mnoho dalších způsobů, jak získat výstup objektu DateTime.

DateTime výstup

Získání výstupu objektu DateTime je jedním z nejdůležitějších aspektů, ale může to být také komplikovaný úkol - opravdu to závisí na vašich potřebách. Dosud jsme viděli velmi základní verzi výstupu: Jednoduché volání metody ToString(). Toto vypíše datum a čas podle aktuální kultury aplikace, která je ve výchozím nastavení založena na systémových nastaveních. To znamená, že pokud jen zavoláte metodu ToString(), datum a čas budou uživateli prezentovány způsobem, který pro něj dává smysl, bez ohledu na to, kde na světě se nachází, protože jak pravděpodobně víte, formát času a zejména data se velmi liší od regionu k regionu.

Pokud chcete mít větší kontrolu nad výstupem, existuje několik způsobů, jak toho dosáhnout. Nejrychlejší způsob je použití jedné z metod To*, například metody ToShortDateString():

Console.WriteLine(DateTime.Now.ToShortDateString());

Toto vypíše krátkou verzi data, úplně vynechá část s časem. Můžete také použít metodu ToLongDateString():

Console.WriteLine(DateTime.Now.ToLongDateString());

Výstup se bude lišit v závislosti na regionálních nastaveních, ale obvykle dlouhé datum zahrnuje textovou reprezentaci měsíce místo číselné reprezentace.

Pokud chcete získat větší kontrolu, možná proto, že chcete přizpůsobit informace o datu/čase konkrétnímu regionu, můžete použít jednu z přetížených verzí metody ToString(), například specifikováním přesně, na kterou kulturu/region cílíte:

var usCulture = new System.Globalization.CultureInfo("en-US");
Console.WriteLine(DateTime.Now.ToString(usCulture.DateTimeFormat));

Třída CultureInfo vám umožňuje získat celou řadu informací o jazyce, například jak píší data a čas (třída CultureInfo bude podrobněji popsána později v tomto tutoriálu). Tyto informace pak můžeme předat třídě DateTime, aby věděla, že chceme, aby vizuální reprezentace data a času odpovídala tomuto jazyku. Ale co když chceme být ještě konkrétnější ohledně výstupu?

Standardní formátovací řetězce pro datum a čas

Pro ještě větší kontrolu nad výstupem můžete použít standardní formátovací řetězce pro datum a čas, které poskytuje .NET framework. Jedná se o jedno písmeno, které reprezentuje způsob zobrazení data a/nebo času. Pro úplný seznam doporučuji, abyste se podívali na dokumentaci, ale prozatím zde je několik příkladů:

DateTime dt = new DateTime(2042, 12, 24, 18, 42, 0);  

Console.WriteLine("Short date pattern (d): " + dt.ToString("d"));  
Console.WriteLine("Long date pattern (D): " + dt.ToString("D"));  
Console.WriteLine("Full date/time pattern (F): " + dt.ToString("F"));  
Console.WriteLine("Year/month pattern (y): " + dt.ToString("y"));

Výstup bude vypadat takto:

Short date pattern (d):         24-12-2042
Long date pattern (D):  24. december 2042
Full date/time pattern (F):     24. december 2042 18:42:00
Year/month pattern (y): december 2042

To vám dává trochu větší kontrolu nad výstupem, ale někdy to není dostatečné - v těch případech potřebujete vlastní formátovací řetězce.

Vlastní formátovací řetězce pro datum a čas

Pro úplnou kontrolu máme vlastní formátovací řetězce. Jsou to kombinace písmen a speciálních znaků, které předáte metodě ToString(), abyste zobrazili přesný formát, který chcete pro své datum a/nebo čas - to zahrnuje, kde chcete části data/času, jak je chcete a jaké oddělovače byste chtěli použít. Samozřejmě to nabízí mnoho možností, takže pro úplný seznam dostupných formátovacích specifikátorů se prosím podívejte na dokumentaci, ale pojďme se podívat, jak to funguje hned:

DateTime dt = new DateTime(2042, 12, 24, 18, 42, 0);

Console.WriteLine(dt.ToString("MM'/'dd yyyy"));
Console.WriteLine(dt.ToString("dd.MM.yyyy"));
Console.WriteLine(dt.ToString("MM.dd.yyyy HH:mm"));
Console.WriteLine(dt.ToString("dddd, MMMM (yyyy): HH:mm:ss"));
Console.WriteLine(dt.ToString("dddd @ hh:mm tt", System.Globalization.CultureInfo.InvariantCulture));

Výstup bude vypadat nějak takto:

12/24 2042
24.12.2042
12.24.2042 18:42
onsdag, december (2042): 18:42:00
Wednesday @ 06:42 PM

Obecně jeden nebo několik d vám dá nějakou verzi dne, jeden nebo několik M vám dá měsíc (malé m je pro minuty) a několik y vám dá rok. Pro úplné pochopení toho, co tyto formátovací specifikátory dělají, stále doporučuji, abyste se podívali na dokumentaci, ale doufám, že výše uvedený příklad vám dal dobrý přehled o tom, jak mocné vlastní formátovací řetězce jsou.

Analýza (parsování) dat

Doposud jsme pracovali s daty přímo definovanými v kódu, ale pravděpodobně se brzy setkáte se situací, kdy budete potřebovat pracovat s datem určeným uživatelem. To je překvapivě složité téma, protože existuje tolik způsobů, jak napsat datum. .NET framework vám s tím může pomoci, protože podporuje všechny kultury, jak bylo ilustrováno v předchozích příkladech, ale stále potřebujete pomoci uživateli specifikovat datum ve formátu, který očekáváte. Poté můžete použít metodu Parse(), abyste uživatelem určený řetězec převedli na objekt DateTime, jako zde:

var usCulture = new System.Globalization.CultureInfo("en-US");
Console.WriteLine("Please specify a date. Format: " + usCulture.DateTimeFormat.ShortDatePattern);
string dateString = Console.ReadLine();
DateTime userDate = DateTime.Parse(dateString, usCulture.DateTimeFormat);
Console.WriteLine("Date entered (long date format):" + userDate.ToLongDateString());

Tento příklad je skvělý, protože ukazuje, jak moc nám může .NET framework pomoci, pokud máme instanci třídy CultureInfo, kterou chceme použít (v tomto případě americkou angličtinu - a nebojte se, třídu CultureInfo budeme diskutovat mnohem podrobněji později). Jakmile to máme, použijeme to pro informování uživatele, který formát očekáváme. Poté to znovu použijeme ve 4. řádku, k vlastnímu parsování vstupu. V posledním řádku vypíšeme uživatelem určené datum, tentokrát pouze ve formátu specifikovaném systémem.

Buďte si však vědomi, že metoda Parse() je velmi striktní - pokud uživatel nezadá datum ve správném formátu, dojde k vyhození výjimky. Z tohoto důvodu je obvykle dobrý nápad použít místo toho metodu TryParse() - dělá přesně to samé, ale umožňuje vám zkontrolovat, zda bylo datum možné analyzovat nebo ne, a nevyhazuje výjimku. Zde je revidovaná verze předchozího příkladu:

var usCulture = new System.Globalization.CultureInfo("en-US");
Console.WriteLine("Please specify a date. Format: " + usCulture.DateTimeFormat.ShortDatePattern);
string dateString = Console.ReadLine();
DateTime userDate;
if (DateTime.TryParse(dateString, usCulture.DateTimeFormat, System.Globalization.DateTimeStyles.None, out userDate))
    Console.WriteLine("Valid date entered (long date format):" + userDate.ToLongDateString());
else
    Console.WriteLine("Invalid date specified!");

Shrnutí

Práce s daty a časem je velmi důležitá, ale také velmi složitá. Naštěstí pro nás je zde .NET framework, který nám pomáhá téměř ve všech situacích s brilantní třídou DateTime.


This article has been fully translated into the following languages: Is your preferred language not on the list? Click here to help us translate this article into your language!