Skip to content

Форматирование даты и времени

Основное использование

Вы можете локализовать дату и время с помощью ваших собственных форматов.

Формат даты и времени показан ниже:

js
const datetimeFormats = {
  'en-US': {
    short: {
      year: 'numeric', month: 'short', day: 'numeric'
    },
    long: {
      year: 'numeric', month: 'short', day: 'numeric',
      weekday: 'short', hour: 'numeric', minute: 'numeric'
    }
  },
  'ja-JP': {
    short: {
      year: 'numeric', month: 'short', day: 'numeric'
    },
    long: {
      year: 'numeric', month: 'short', day: 'numeric',
      weekday: 'short', hour: 'numeric', minute: 'numeric', hour12: true
    }
  }
}

Как видно выше, вы можете определить именованный формат даты и времени (например, short, long и т.д.), и вам нужно использовать параметры с ECMA-402 Intl.DateTimeFormat

После этого, при использовании локальных сообщений, необходимо указать параметр datetimeFormats функции createI18n:

js
const i18n = createI18n({
  datetimeFormats
})

Чтобы локализовать значение даты и времени с помощью Vue I18n, используйте $d.

NOTE

Обратите внимание, что имя параметра — datetimeFormats в VueI18n v9, а не dateTimeFormats. Подробнее см. в гиде по миграции

TIP

$d имеет несколько перегрузок. Вы можете получить больше информации в справочнике по API

NOTE

Некоторые способы поддержки локализации:

  • $d (для Legacy API режима и Composition API режима)
  • встроенный компонент DatetimeFormat (i18n-d)
  • экспортированная функция d из useI18n (для Composition API режима)

Ниже приведен пример использования $d в шаблоне:

html
<p>{{ $d(new Date(), 'short') }}</p>
<p>{{ $d(new Date(), 'long', 'ja-JP') }}</p>

Первый аргумент — это значение даты и времени (например, Date, временная метка) в качестве параметра, второй аргумент — имя формата даты и времени в качестве параметра. Последний аргумент — значение локали в качестве параметра.

В результате получаем:

html
<p>Apr 19, 2017</p>
<p>2017年4月19日(水) 午前2:19</p>

Пользовательское форматирование

$d возвращает строку с полностью отформатированными датой и временем, которая может использоваться только как целое. В ситуациях, когда необходимо стилизовать отдельную часть отформатированной даты и времени (например, дробные цифры), $d недостаточно. В таких случаях поможет компонент DatetimeFormat (i18n-d).

С минимальным набором свойств i18n-d генерирует тот же вывод, что и $d, обернутый в сконфигурированный элемент DOM.

Следующий шаблон:

html
<i18n-d tag="p" :value="new Date()"></i18n-d>
<i18n-d tag="p" :value="new Date()" format="long"></i18n-d>
<i18n-d tag="p" :value="new Date()" format="long" locale="ja-JP-u-ca-japanese"></i18n-d>

Компонент DatetimeFormat имеет некоторые свойства.

Свойство tag — это свойство для установки тега.

Свойство value — это свойство для установки значения даты и времени, которое будет отформатировано.

Свойство format — это свойство, с помощью которого можно задать формат, определенный параметром datetimeFormats функции createI18n.

Свойство locale — это свойство для установки локали. Локализация производится с использованием указанной в этом свойстве локали вместо локали, указанной в параметре locale функции createI18n.

Это произведет следующий вывод:

html
<p>11/3/2020</p>
<p>11/03/2020, 02:35:31 AM</p>
<p>令和2年11月3日火曜日 午前2:35:31 日本標準時</p>

Но настоящая мощь этого компонента проявляется, когда он используется с scoped slots.

Допустим, есть необходимость отобразить часть даты и времени (эпоху) жирным шрифтом. Это можно реализовать, указав элемент scoped slot era:

html
<i18n-d tag="span" :value="new Date()" locale="ja-JP-u-ca-japanese" :format="{ key: 'long', era: 'narrow' }">
  <template #era="props">
    <span style="color: green">{{ props.era }}</span>
  </template>
</i18n-d>

Указанный выше шаблон приведет к следующему HTML:

html
<span><span style="color: green;">R</span>2年11月3日火曜日 午前2:35:31 日本標準時</span>

Можно одновременно указать несколько scoped slots:

html
<i18n-d tag="span" :value="new Date()" locale="ja-JP-u-ca-japanese" :format="{ key: 'long', era: 'narrow' }">
  <template #era="props">
    <span style="color: green">{{ props.era }}</span>
  </template>
  <template #literal="props">
    <span style="color: green">{{ props.literal }}</span>
  </template>
</i18n-d>

(этот результат HTML был отформатирован для лучшей читаемости)

html
<span>
  <span style="color: green;">R</span>2
  <span style="color: green;">年</span>11
  <span style="color: green;">月</span>3
  <span style="color: green;">日</span>火曜日
  <span style="color: green;"> </span>午前3
  <span style="color: green;">:</span>09
  <span style="color: green;">:</span>56
  <span style="color: green;"> </span>日本標準時
</span>

NOTE

Полный список поддерживаемых scoped slots, а также другие свойства i18n-d можно найти в справочнике по API

Разрешение области видимости

Разрешение области видимости компонента DatetimeFormat аналогично компоненту Translation.

См. здесь