Использование шаблонов для форматирования даты и времени

Используйте классы в пространстве имен Windows.Globalization.DateTimeFormatting с настраиваемыми шаблонами и шаблонами для отображения дат и времени в нужном формате.

Введение

Класс DateTimeFormatter предоставляет различные способы правильного форматирования дат и времени для языков и регионов по всему миру. Стандартные форматы можно использовать в течение года, месяца, дня и т. д. Вы также можете передать шаблон формата в аргумент formatTemplate конструктора DateTimeFormatter , например "longdate" или "month day".

Но если требуется еще больше контроля над порядком и форматом компонентов объекта DateTime, который вы хотите отобразить, можно передать шаблон формата в аргумент formatTemplate конструктора. Шаблон формата использует специальный синтаксис, который позволяет получать отдельные компоненты объекта DateTime — только имя месяца или только значение года, например, чтобы отобразить их в любом выбранном пользовательском формате. Кроме того, шаблон можно локализовать для адаптации к другим языкам и регионам.

Обратите внимание , что это только обзор шаблонов формата. Дополнительные сведения о шаблонах формата и шаблонах форматирования см. в разделе "Примечания" класса DateTimeFormatter.

Разница между шаблонами форматирования и шаблонами форматирования

Шаблон формата — это строка формата, не зависящая от языка и региональных параметров. Таким образом, если вы создаете DateTimeFormatter с помощью шаблона формата, средство форматирования отображает компоненты формата в правильном порядке для текущего языка. И наоборот, шаблон формата зависит от языка и региональных параметров. Если вы создаете DateTimeFormatter с помощью шаблона формата, средство форматирования будет использовать шаблон точно так же, как указано. Следовательно, шаблон не обязательно является допустимым в разных языках и региональных параметров.

Проиллюстрируем это различие с примером. Мы передадим простой шаблон формата (а не шаблон) конструктору DateTimeFormatter . Это шаблон формата "день месяца".

var dateFormatter = new Windows.Globalization.DateTimeFormatting.DateTimeFormatter("month day");

При этом создается метод форматирования на основе значения языка и региона текущего контекста. Порядок компонентов в шаблоне формата не имеет значения; Модуль форматирования отображает их в правильном порядке для текущего языка. Таким образом, он отображает "1 января" для английского (США), "1 janvier" для французского (Франция) и "1月1日" для японского языка.

С другой стороны, шаблон формата зависит от языка и региональных параметров. Давайте перейдем к шаблону формата для шаблона формата.

IReadOnlyList<string> monthDayPatterns = dateFormatter.Patterns;

Это дает разные результаты в зависимости от языка среды выполнения и региона. Разные регионы могут использовать разные компоненты в разных заказах с дополнительными символами и интервалами или без нее.

En-US: "{month.full} {day.integer}"
Fr-FR: "{day.integer} {month.full}"
Ja-JP: "{month.integer}月{day.integer}日"

В приведенном выше примере мы ввели строку формата, не зависящую от языка и региональных параметров, и мы вернулись к строке формата, зависящему от языка и региона (которая была в действии при вызове dateFormatter.Patterns). Поэтому, если вы создаете DateTimeFormatter из шаблона формата, зависящее от языка и региональных параметров, оно будет допустимо только для определенных языков или регионов.

var dateFormatter = new Windows.Globalization.DateTimeFormatting.DateTimeFormatter("{month.full} {day.integer}");

Приведенный выше форматировщик возвращает значения, относящиеся к языку и региональных параметров, для отдельных компонентов внутри квадратных скобок {}. Но порядок компонентов в шаблоне формата является инвариантным. Вы получаете именно то, что вы просите, что может или не быть культурно подходящим. Этот форматировщик действителен для английского языка (США), но не для французского (Франция) или японского языка.

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 , включающее значения для месяца, дня и т. д., в любом порядке.
  • Гарантированно возвращать допустимый стандартный формат во всех значениях языкового региона, поддерживаемых Windows.
  • Гарантируется, что вы предоставляете соответствующую языку строку в формате, соответствующую языку.
  • Не все сочетания компонентов допустимы. Например, "dayofweek day" недопустим.

Формат шаблонов, таких как "{month.full} {day.integer}"

  • Явно упорядоченная строка, которая выражает полное имя месяца, за которым следует пробел, за которым следует целое число дня, в этом порядке или любой заданный шаблон формата.
  • Может не соответствовать допустимому стандартному формату для любой пары языкового региона.
  • Не гарантируется, что он будет культурно подходящим.
  • Любое сочетание компонентов может быть указано в любом порядке.

Примеры

Предположим, что вы хотите отобразить текущий месяц и день вместе с текущим временем в определенном формате. Например, вы хотите, чтобы пользователи английского языка США видели примерно следующее:

June 25 | 1:38 PM

Часть даты соответствует шаблону формата "месяц день", а часть времени соответствует шаблону формата "час минуты". Таким образом, можно создавать форматировщики для соответствующих шаблонов формата даты и времени, а затем объединять их выходные данные вместе с помощью строки локализованного формата.

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 — это идентификатор ресурса, ссылающийся на локализуемый ресурс в файле ресурсов (resw). Для языка английского языка по умолчанию (США), это значение будет иметь значение "{0} | {1}" вместе с комментарием, указывающим, что "{0}" является датой и "{1}" — это время. Таким образом переводчики могут настраивать элементы формата по мере необходимости. Например, они могут изменить порядок элементов, если он кажется более естественным на каком-либо языке или регионе, чтобы время предшествует дате. Кроме того, они могут заменить "|" другим символом разделителя.

Другой способ реализации этого примера заключается в том, чтобы запросить два модуля форматирования для шаблонов форматирования, объединить их вместе, а затем создать третье средство форматирования из шаблона результирующих форматов.

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);

Важные API