Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Pomocí tříd v Windows.Globalization.DateTimeFormatting oboru názvů s vlastními šablonami a vzory zobrazte data a časy v přesně požadovaném formátu.
Úvod
Třída DateTimeFormatter poskytuje různé způsoby, jak správně formátovat data a časy pro jazyky a oblasti po celém světě. Standardní formáty můžete použít pro rok, měsíc, den atd. Nebo můžete například předat formátovou šablonu jako "longdate" nebo "month day" do argumentu konstruktoru DateTimeFormatterformatTemplate.
Ale pokud chcete ještě větší kontrolu nad pořadím a formátem součástí objektu DateTime , který chcete zobrazit, můžete předat vzor formátu do argumentu formatTemplate konstruktoru. Vzor formátu používá speciální syntaxi, která umožňuje získat jednotlivé součásti objektu DateTime – pouze název měsíce nebo jen hodnotu roku – například – a zobrazit je v libovolném vlastním formátu. Model lze navíc lokalizovat tak, aby se přizpůsobil jiným jazykům a oblastem.
Poznámka Toto je pouze přehled vzorů formátu. Podrobnější diskuzi o formátových šablonách a vzorech formátu naleznete v části Poznámky třídy DateTimeFormatter .
Rozdíl mezi šablonami formátu a vzory formátů
Šablona formátu je řetězec formátu nezávislý na kulturní specifikaci. Takže pokud vytvoříte DateTimeFormatter pomocí šablony formátu, pak formátovací modul zobrazí komponenty formátu ve správném pořadí pro aktuální jazyk. Naopak, formátový vzor je specifický pro kulturní kontext. Pokud vytvoříte DateTimeFormatter pomocí vzoru formátu, pak formátovací modul použije vzor přesně tak, jak je uveden. V důsledku toho vzor nemusí být nutně platný v různých jazykových verzích.
Pojďme si tento rozdíl ukázat na příkladu. Do konstruktoru DateTimeFormatter předáme jednoduchou šablonu formátu (ne vzor). Toto je šablona formátu "měsíc den".
var dateFormatter = new Windows.Globalization.DateTimeFormatting.DateTimeFormatter("month day");
Tím se vytvoří formátovací modul založený na hodnotě jazyka a oblasti aktuálního kontextu. Pořadí komponent v šabloně formátu nezáleží; formátovací modul je zobrazí ve správném pořadí pro aktuální jazyk. Zobrazí se tedy "1. ledna" pro angličtinu (Spojené státy), "1 janvier" pro francouzštinu (Francie) a "1月1日" pro japonštinu.
Na druhou stranu je vzor formátování kulturně specifický. Pojďme získat přístup k vzoru formátu pro naši šablonu formátu.
IReadOnlyList<string> monthDayPatterns = dateFormatter.Patterns;
Výsledkem jsou různé výsledky v závislosti na jazyce modulu runtime a oblasti. Různé oblasti můžou používat různé komponenty v různých pořadích s dalšími znaky a mezerami nebo bez.
En-US: "{month.full} {day.integer}"
Fr-FR: "{day.integer} {month.full}"
Ja-JP: "{month.integer}月{day.integer}日"
V předchozím příkladu jsme zadali řetězec formátu nezávislý na kulturní verzi a vrátil se nám řetězec formátu specifický pro kulturní verzi (který byl funkcí jazyka a oblasti, která se projevila, když jsme volali dateFormatter.Patterns). Z toho vyplývá, že pokud vytvoříte DateTimeFormatter ze vzoru formátu specifického pro kulturu, bude platný pouze pro konkrétní jazyky nebo oblasti.
var dateFormatter = new Windows.Globalization.DateTimeFormatting.DateTimeFormatter("{month.full} {day.integer}");
Formátovač výše uvedený vrátí hodnoty specifické pro kulturní zvyklosti pro jednotlivé komponenty uvnitř závorek {}. Pořadí součástí ve formátu je však invariantní. Získáte přesně to, co požadujete, což může nebo nemusí být kulturně vhodné. Tento formátovací modul je platný pro angličtinu (Spojené státy), ale ne pro francouzštinu (Francie) ani pro japonštinu.
En-US: January 1
Fr-FR: janvier 1 (inappropriate for France; non-standard order)
Ja-JP: 1月1 (inappropriate for Japan; the day symbol 日 is missing)
Vzor, který je dnes správný, navíc nemusí být v budoucnu správný. Země nebo oblasti můžou změnit své kalendářní systémy, které mění šablonu formátu. Systém Windows aktualizuje výstup formátovacích funkcí na základě šablon formátů, aby se přizpůsobil těmto změnám. Proto byste měli použít pouze syntaxi vzoru za jedné nebo více z těchto podmínek.
- Nejste závislí na konkrétním výstupu pro formát.
- K dodržování některých standardů specifických pro jazykovou verzi nepotřebujete formát.
- Konkrétně máte v úmyslu, aby model byl v různých jazykových verzích invariantní.
- Chcete lokalizovat samotný řetězec vzoru formátu.
Tady je souhrn rozdílů mezi šablonami formátu a vzory formátu.
šablony formátu, například "den měsíce"
- Abstraktní reprezentace formátu DateTime , který obsahuje hodnoty pro měsíc, den atd., v libovolném pořadí.
- Zaručeno vrácení platného standardního formátu ve všech hodnotách jazyka a oblastí podporovaných systémem Windows.
- Zaručeno, že vám poskytnete kulturně vhodný formátovaný řetězec pro danou jazykovou oblast.
- Ne všechny kombinace součástí jsou platné. Například "dayofweek day" není platný.
Formátovací vzory, například {month.full} {day.integer}.
- Explicitně seřazený řetězec, který vyjadřuje celý název měsíce následovaný mezerou následovanou celým číslem dne, v daném pořadí nebo jakýmkoli konkrétním vzorem formátu, který zadáte.
- Nemusí odpovídat platnému standardnímu formátu pro libovolný pár jazyka a oblasti.
- Není zaručeno, že bude kulturně vhodné.
- Lze zadat libovolnou kombinaci součástí v libovolném pořadí.
Příklady
Předpokládejme, že chcete zobrazit aktuální měsíc a den společně s aktuálním časem v určitém formátu. Chcete například, aby se uživatelům v angličtině v USA zobrazilo něco takového:
June 25 | 1:38 PM
Část data odpovídá šabloně formátu "den měsíce" a časová část odpovídá šabloně formátu "hodinová minuta". Můžete tedy vytvořit formátovací moduly pro příslušné šablony formátu data a času a pak zřetězit jejich výstup pomocí lokalizovatelného řetězce formátu.
var dateToFormat = System.DateTime.Now;
var resourceLoader = Windows.ApplicationModel.Resources.ResourceLoader.GetForCurrentView();
var dateFormatter = new Windows.Globalization.DateTimeFormatting.DateTimeFormatter("month day");
var timeFormatter = new Windows.Globalization.DateTimeFormatting.DateTimeFormatter("hour minute");
var date = dateFormatter.Format(dateToFormat);
var time = timeFormatter.Format(dateToFormat);
string output = string.Format(resourceLoader.GetString("CustomDateTimeFormatString"), date, time);
CustomDateTimeFormatString je identifikátor prostředku odkazující na lokalizovatelný prostředek v souboru prostředků (.resw). Pro výchozí jazyk angličtiny (Spojené státy) by se tato hodnota nastavovala na hodnotu |{0}{1}spolu s komentářem označujícím, že{0} "" je datum a "{1}" je čas. Překladatelé tak můžou upravit položky formátu podle potřeby. Mohou například změnit pořadí položek, pokud se v některých jazycích nebo oblastech zdá být přirozenější, aby měly čas před datem. Nebo mohou nahradit |jiným znakem oddělovače.
Dalším způsobem implementace tohoto příkladu je dotazování dvou formátovacích metod pro jejich vzory formátu, zřetězení těchto vzorů a následné vytvoření třetího formátovacího modelu z výsledného vzoru formátu.
var resourceLoader = Windows.ApplicationModel.Resources.ResourceLoader.GetForCurrentView();
var dateFormatter = new Windows.Globalization.DateTimeFormatting.DateTimeFormatter("month day");
var timeFormatter = new Windows.Globalization.DateTimeFormatting.DateTimeFormatter("hour minute");
string dateFormatterPattern = dateFormatter.Patterns[0];
string timeFormatterPattern = timeFormatter.Patterns[0];
string pattern = string.Format(resourceLoader.GetString("CustomDateTimeFormatString"), dateFormatterPattern, timeFormatterPattern);
var patternFormatter = new Windows.Globalization.DateTimeFormatting.DateTimeFormatter(pattern);
string output = patternFormatter.Format(System.DateTime.Now);
Důležitá rozhraní API
Související témata
Windows developer