Заметка
Доступ к этой странице требует авторизации. Вы можете попробовать войти в систему или изменить каталог.
Доступ к этой странице требует авторизации. Вы можете попробовать сменить директорию.
Используйте классы в пространстве имен 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
Связанные темы
Windows developer