Jistě jste se už dostali do situace, kdy jste potřebovali mít datum a čas naformátovaný přesně podle svých potřeb a nikoliv podle toho, jak je nastaven formát data a času na serveru, kde ASP.NET aplikace běží. V následujícím článku se pokusím vám problematiku přiblížit a nasměrovat vás k možnému řešení.

Je tomu již několik let, co na Intervalu vyšel seriál článků „Jak na datum a čas nejenom v ASP“ (viz níže). Tímto článkem bych chtěl na tento seriál volně navázat a popsat možnosti práce s datem a časem v ASP.NET. Jistě si vzpomenete, co dalo práce v ASP naformátovat datum a čas do řetězce, který by nám vyhovoval. V ASP.NET je situace poněkud odlišná a dovolím si říci, že i jednodušší.

Struktura DateTime, obsažená ve jmenném prostoru System, má sice řadu metod pro konverzi data a času na řetězec (o všech si můžete přečíst v MSDN), my se dnes ale zaměříme na metodu jedinou, a to na ToString. Tato metoda umožňuje pomocí formátovacích znaků, které si následně popíšeme, velice jednoduše naformátovat výstup data a času.

DateTime datumcas=DateTime.Now;
string string_datumcas;
string_datumcas=datumcas.ToString(„d“);

Standardně jsou definovány jednoznakové formátovací vzory, Ve vzorech se rozlišují malá a velká písmena a tudíž „d“ a „D“ jsou zcela rozdílné vzorky. Ovšem než složitě popisovat, co který vzorek dělá, rozhodl jsem se připravit tabulku, kde bude uveden formátovací vzorek a výsledek formátování.

Vzorek Výsledek česky Výsledek anglicky Popis
d 17.12.2003 12/17/2003 krátký formát data
D 17. prosince 2003 Wednesday, December 17, 2003 dlouhý formát data
f 17. prosince 2003 17:42 Wednesday, December 17, 2003 5:42 PM dlouhý formát data s krátkým formátem času
F 17. prosince 2003 17:42:22 Wednesday, December 17, 2003 5:42:22 PM dlouhý formát data s dlouhý formátem času
g 17.12.2003 17:42 12/17/2003 9:32 PM krátký formát data s krátkým formátem času
G 17.12.2003 17:42:22 12/17/2003 9:32:51 PM krátký formát data s dlouhým formátem času
m, M 17 prosince December 17 den a měsíc
r, R Wed, 17 Dec 2003 17:42:22 GMT Wed, 17 Dec 2003 17:42:22 GMT formát podle RFC1123
s 2003-12-17T17:42:22 2003-12-17T17:42:22 tříditelný formát založený na ISO 8601
t 17:42 5:42 PM krátký formát času
T 17:42:22 5:42:22 PM dlouhý formát času
u 2003-12-17 17:42:22Z 2003-12-17 17:42:22Z univezální tříditelný formát data
U 17. prosince 2003 16:42:22 Wednesday, December 17, 2003 4:42:22 PM plné datum a čas
y, Y prosinec 2003 December, 2003 měsíc a rok

Jak v tabulce zřetelně vidíte, několik formátů odporuje pravidlům českého pravopisu, nedostatkem je například absence mezery po tečce za číslem dne nebo absence tečky po číslu dne.

Záhy přitom zjistíte, že způsob zobrazení data a času je závislý na nastavení serveru, aplikace nebo stránky. Co však dělat, pokud potřebujeme mít v jedné stránce zobrazen datum a čas podle více národních zvyklostí? Musíme použít třídu CultureInfo ze jmenného prostoru System.Globalization, která nese informace o národních zvyklostech. Stačí při konverzi předat metodě ToString jako volitelný parametr odkaz na informaci o kultuře, která má být použita.

Informace o národním prostředí použijeme přímo v kódu například takto…

CultureInfo cesky = new CultureInfo( „cs-CZ“); DateTime datumcas=DateTime.Now;
string string_datumcas;
string_datumcas=datumcas.ToString(„d“,cesky);

…nebo takto (přičemž obě varianty jsou identické):

CultureInfo cesky = new CultureInfo( „0x0405“); DateTime datumcas=DateTime.Now;
string string_datumcas;
string_datumcas=datumcas.ToString(„d“,cesky);

Nebudu zde uvádět kompletní výčet nastavení kultur, ale omezím se pouze na pár, které dle mého názoru nejčastěji použijete. Kompletní seznam kultur najdete samozřejmě v MSDN.

Culture Name Culture Identifier Jazyk-stát/region
cs 0x0005 Čeština
cs-CZ 0x0405 Čeština – Česká republika
en 0x0009 Angličtina
en-GB 0x0809 Angličtina – Velká Británie
en-US 0x0409 Angličtina – Spojené státy americké
sk 0x001B Slovenština
sk-SK 0x041B Slovenština – Slovenská republika

Standardní předdefinované formáty data a času jsou sice krásná věc, ale zcela určitě bude chtít mnoho z vás naformátovat datum a čas odlišným způsobem. Existují proto vzorové sekvence, sestavené ze znaků uvedených ve výše popsané tabulce:

Vzorek Výsledek Komentář
d 4 číslo dne
dd 04 číslo dne (pokud je menší než 10, je s nulou na počátku)
ddd zkratka názvu dne
dddd pátek název dne
M 7/td>

číslo měsíce
MM 07 číslo měsíce (pokud je menší než 10, je s nulou na počátku)
MMM VII název měsíce (zkratka, ale v některých národních nastaveních římské číslo)
MMMM červenec název měsíce
y 3 letopočet
yy 03 letopočet
yyyy 2003 letopočet
gg n.l. označení éry
h 5 hodiny (12 hodinový formát)
hh 5 hodiny (12 hodinový formát)
H 16 hodiny (24 hodinový formát)
HH 16 hodiny (24 hodinový formát)
m 5 minuty
mm 05 minuty
s 3 sekundy
ss 03 sekundy
f 0 tisíciny sekundy na 1 místo
ff 04 tisíciny sekundy na 2 místa
fff 044 tisíciny sekundy na 2 místa
ffff 0440 tisíciny sekundy na 2 místa
fffff 04400 tisíciny sekundy na 2 místa
ffffff 04000 tisíciny sekundy na 2 místa
fffffff 040000 tisíciny sekundy na 2 místa
t o rozlišení dopoledne a odpoledne
tt odp. rozlišení dopoledne a odpoledne
z +2 odchylka od GMT
zz +02 odchylka od GMT
zzz +02:00 odchylka od GMT
: : defaultní oddělovač času
/ / defaultní oddělovač data

Tímto jsme vyčerpali možnosti transformace struktury DateTime na datový typ String. Mám tu však nakonec dva malé přídavky – několik ukázek, jak naformátovat datum a čas, a také, jak vypadá zobrazení data a času při různém národním nastavení. Podívejte se na příklad, jehož zdrojový kód je vám samozřejmě k dispozici. Příklad nemá žádné praktické využití a slouží jen pro demonstraci odlišností zobrazení při různém národním prostředí.

Starší komentáře ke článku

Pokud máte zájem o starší komentáře k tomuto článku, naleznete je zde.

1 Příspěvěk v diskuzi

  1. Je možné aby byl telefon předprogramován
    Ietopočtem jen na 10 let? Koupil jsem si telefon Samsung v r . 2008.Do konce roku 2014 chodil správně.Ale po 31.12. 2014 naskočil 1.1.2014.Při manuálnim zadáni r.2015 vyskakuje heslo „chybný záznam“Rok výroby telefonu je 2004.Děkuji za odpověď

Odpovědět