Использование шаблонов для форматирования даты и времени (HTML)
[ Эта статья адресована разработчикам приложений среды выполнения Windows для Windows 8.x и Windows Phone 8.x. В случае разработки приложений для Windows 10 см. раздел последняя документация]
Для отображения даты и времени в желаемом формате можно воспользоваться API Windows.Globalization.DateTimeFormatting с пользовательскими шаблонами.
Windows.Globalization.DateTimeFormatting предоставляет различные способы форматирования даты и времени в соответствии с языковыми и региональными стандартами, применяемыми во всем мире. В большинстве случаев используются стандартные форматы для года, месяца, дня и т. п. Можно использовать стандартные шаблоны строки, такие как "longdate" ("длинная дата") или "month day" ("месяц день"), которые гарантируют, что полученный в итоге формат DateTime будет соответствовать региональным параметрам, языку и региону пользователя. Но в некоторых случаях требуется более гибкое управление порядком и форматом составляющих строки DateTime, которую нужно отображать. Например, это может понадобиться, если приложение ориентировано на определенный регион или если разработчик хочет отображать составляющие в нестандартном формате.
В этом случае можно использовать особый синтаксис для параметра шаблона строки, который называется "шаблоном". Синтаксис шаблонов позволяет получить отдельные составляющие объекта DateTime— например, только название месяца или только значение года, —чтобы отобразить их в выбранном пользовательском формате.
Что необходимо знать
Технологии
Необходимые условия
- Глобализация и локализация
- Инструкции и контрольный список для глобализации приложения
- Краткое руководство: использование форматов международного стандарта
Важно отметить, что при использовании шаблонов вы создаете пользовательский формат, который может подходить не для всех культур. Например, рассмотрим шаблон "month day" ("месяц день"):
var datefmt = new Windows.Globalization.DateTimeFormatting.DateTimeFormatter("month day");
В результате создается модуль форматирования на основе языка и региона в текущем контексте. Следовательно, месяц и день будут всегда отображаться вместе в подходящем глобальном формате. Например, для английского языка (США) будет показываться "January 1", для французского языка (Франция) — "1 janvier", а для японского — "1月1日". Это достигается благодаря тому, что шаблон строится на основе строки, учитывающей особенности культуры, причем доступ к ней можно получить с помощью свойства шаблона:
var monthdaypattern = datefmt.patterns;
В итоге, в зависимости от языка и региона модуля форматирования, будут получены разные результаты. Обратите внимание, что в разных регионах могут использоваться различные составляющие, в разном порядке, с добавлением дополнительных символов и пробелов или без них:
En-US: "{month.full} {day.integer}"
Fr-FR: "{day.integer} {month.full}"
Ja-JP: "{month.integer}月{day.integer}日"
Вы можете использовать шаблоны для создания пользовательских DateTimeFormatter, например такой, созданный на основе шаблона английского языка (США):
var datefmt = new Windows.Globalization.DateTimeFormatting.DateTimeFormatter("{month.full} {day.integer}");
Windows возвращает значения, зависящие от языка и региональных параметров, для отдельных составляющих, заключенных в скобки {}. Но при использовании синтаксиса шаблонов порядок составляющих остается неизменным. Вы получаете именно то, что хотели, но соответствие культуре не гарантируется:
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)
Более того, нет гарантии, что шаблоны будут оставаться непротиворечивыми с течением времени. Страны или регионы могут менять свои календарные системы, в результате чего меняется и шаблон формата. Windows обновляет выходные данные модулей форматирования в соответствии с этими изменениями. Поэтому использовать синтаксис шаблонов для форматирования DateTime можно только в следующих случаях.
- Если для вас не важен конкретный результат форматирования.
- Если вам не нужно, чтобы формат соответствовал какому-либо зависящему от языка и региональных параметров стандарту.
- Если вам нужно, чтобы шаблон был независимым от языка и региональных параметров.
- Если вы планируете локализовать шаблон.
Различия между стандартными шаблонами строки и нестандартными шаблонами заключаются в следующем.
Шаблоны строки, такие как "месяц день":
- Абстрактные представления в формате DateTime, включающие значения месяца и дня, следующие в некотором порядке.
- Гарантируется получение действительного стандартного формата для всех вариантов языков и регионов, поддерживаемых Windows.
- Гарантируется получение строки, отформатированной в соответствии с культурой, для заданного языка и региона.
- Не все комбинации составляющих являются допустимыми. Например, не существует шаблона строки для "dayofweek day" ("день_недели день").
Шаблоны строки, такие как "{month.full} {day.integer}":
- Явно заданная строка, определяющая полное название месяца с последующим пробелом, затем — день целым числом в этом порядке.
- Может не соответствовать допустимому стандартному формату для некоторых пар "язык-регион".
- Не гарантируется соответствие культуре.
- Может быть задана любая комбинация составляющих в любом порядке.
Инструкции
Предположим, что требуется отобразить текущие месяц и день вместе с текущим временем в некотором формате. Например, вы хотите, чтобы пользователи с английским языком (США) увидели данные в следующем формате:
June 25 | 1:38 PM
Компонент даты соответствует шаблону "month day" ("месяц день"), а компонент времени — шаблону "hour minute" ("час минута"). Поэтому вы можете создать пользовательский формат, объединяющий эти шаблоны.
Сначала получите модули форматирования для нужных шаблонов даты и времени, а затем получите образцы этих шаблонов:
// Get formatters for the date part and the time part.
var dtf = Windows.Globalization.DateTimeFormatting;
var mydate = dtf.DateTimeFormatter("month day");
var mytime = dtf.DateTimeFormatter("hour minute");
// Get the patterns from these formatters.
var mydatepattern = mydate.patterns[0];
var mytimepattern = mytime.patterns[0];
Пользовательский формат следует сохранить как локализуемую строку ресурса. Например, строка для английского языка (США) будет иметь вид "{date} | {time}". Локализаторы могут настроить эту строку нужным образом. Например, они могут изменить порядок составляющих, если для того или иного языка или региона естественнее указывать время перед датой. Они также могут заменить "|" другим знаком разделения. Во время выполнения части строки {date} и {time} будут заменены соответствующими шаблонами:
// Assemble the custom pattern. This string comes from a resource, and should be localizable.
var mydateplustime = WinJS.Resources.getString("date_plus_time");
mydateplustime = mydateplustime.replace("{date}", mydatepattern);
mydateplustime = mydateplustime.replace("{time}", mytimepattern);
Затем вы можете создать новый модуль форматирования на основе пользовательского шаблона:
// Get the custom formatter.
var mydateplustimefmt = new dtf.DateTimeFormatter(mydateplustime);
Связанные разделы
Пример форматирования даты и времени