This article has been localized into Czech by the community.
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.