Intl.DateTimeFormat: примеры (JAVASCRIPT)

Intl.DateTimeFormat: Форматирование дат и времени в JS
Раздел: Интернационазация, Дата
Intl.DateTimeFormat(locales (string, Array), options (object)): Intl.DateTimeFormat

Функция Intl.DateTimeFormat

Конструктор Intl.DateTimeFormat создает объекты для форматирования даты и времени с учетом языка и региональных настроек. Он применяется для представления дат в понятном пользователю формате, который варьируется в зависимости от локали.

Функция используется, когда необходимо отобразить дату или время в соответствии с региональными стандартами, например, для интернационализации приложений.

Аргументы

  • locales (необязательный): Строка с тегом языка BCP 47 или массив таких строк. Определяет язык и правила форматирования (например, 'ru-RU', 'en-US').
  • options (необязательный): Объект с настройками для кастомизации вывода. Его свойства определяют компоненты даты и стили форматирования.

Опции объекта настроек

  • dateStyle, timeStyle: Строки, определяющие предустановленные форматы. Возможные значения: 'full', 'long', 'medium', 'short'.
  • localeMatcher: Алгоритм сопоставления локалей ('lookup' или 'best fit').
  • timeZone: Название часового пояса (например, 'Europe/Moscow'). По умолчанию используется системный.
  • hour12: Булево значение для определения 12-часового (true) или 24-часового (false) формата времени.
  • formatMatcher: Алгоритм сопоставления формата ('basic' или 'best fit').
  • Компоненты даты/времени: weekday, era, year, month, day, hour, minute, second, timeZoneName. Для каждого можно указать стиль отображения (например, 'numeric', '2-digit', 'long', 'short', 'narrow').
  • calendar, dayPeriod, numberingSystem, hourCycle: Специфичные настройки календаря, периода дня, системы нумерации и цикла часов.

Возвращаемое значение

Конструктор возвращает объект Intl.DateTimeFormat, который содержит метод format(date) для форматирования объекта Date. Также доступны методы formatRange(startDate, endDate) для диапазонов и formatToParts(date) для получения частей отформатированной строки.

Примеры использования

Простой пример с локалью по умолчанию:

new Intl.DateTimeFormat().format(new Date('2024-01-15'))
"15.01.2024" (результат для локали ru-RU)

Использование явного указания локали:

new Intl.DateTimeFormat('en-US').format(new Date('2024-01-15'))
"1/15/2024"

Применение опций для кастомизации:

new Intl.DateTimeFormat('ru-RU', {
  weekday: 'long',
  year: 'numeric',
  month: 'long',
  day: 'numeric'
}).format(new Date('2024-01-15'))
"понедельник, 15 января 2024 г."

Форматирование времени с часовым поясом:

new Intl.DateTimeFormat('ru-RU', {
  hour: 'numeric',
  minute: 'numeric',
  timeZone: 'America/New_York',
  timeZoneName: 'short'
}).format(new Date('2024-01-15T10:30:00Z'))
"05:30 EST"

Использование dateStyle и timeStyle:

new Intl.DateTimeFormat('ru-RU', {
  dateStyle: 'full',
  timeStyle: 'long'
}).format(new Date('2024-01-15T10:30:00'))
"понедельник, 15 января 2024 г., 10:30:00 GMT+3"

Похожие функции в JavaScript

Date.prototype.toLocaleDateString() / toLocaleTimeString() / toLocaleString(): Упрощенные методы для форматирования дат и времени. Используют те же аргументы locales и options, что и Intl.DateTimeFormat. Предпочтительны для простых случаев, когда не требуется повторное использование объекта форматирования.

Moment.js (и другие библиотеки): Библиотеки для работы с датами, предлагающие расширенные возможности парсинга, валидации, манипуляций и форматирования. Intl.DateTimeFormat является нативной альтернативой для задач форматирования, не требуя подключения сторонних библиотек.

Выбор зависит от задачи: для сложных манипуляций с датами могут подойти библиотеки, а для интернационализации форматирования нативная Intl API обычно эффективнее.

Альтернативы в других языках

PHP

Функция IntlDateFormatter из расширения intl.

$formatter = new IntlDateFormatter('ru_RU', IntlDateFormatter::FULL, IntlDateFormatter::FULL);
echo $formatter->format(new DateTime('2024-01-15 10:30:00'));
"понедельник, 15 января 2024 г., 10:30:00 Московское стандартное время"

Python

Модуль locale и метод strftime.

import locale
from datetime import datetime
locale.setlocale(locale.LC_TIME, 'ru_RU.UTF-8')
print(datetime(2024, 1, 15).strftime('%A, %d %B %Y'))
"понедельник, 15 января 2024"

MySQL

Функция DATE_FORMAT().

SELECT DATE_FORMAT('2024-01-15', '%W, %d %M %Y');
"Monday, 15 January 2024"

C#

Метод ToString с указанием формата и культуры.

DateTime.Now.ToString("D", new System.Globalization.CultureInfo("ru-RU"));
"15 января 2024 г."

Основное отличие JavaScript функции - её интеграция в стандарт ECMAScript и использование объектов Intl, что обеспечивает единообразие в браузерах и среде Node.js.

Типичные ошибки

Передача строки даты вместо объекта Date в метод format.

new Intl.DateTimeFormat('ru-RU').format('2024-01-15');
RangeError: Invalid time value

Указание несуществующего часового пояса.

new Intl.DateTimeFormat('ru-RU', { timeZone: 'Неизвестный/Пояс' }).format(new Date());
RangeError: Invalid time zone specified

Некорректная локаль в массиве locales может привести к использованию локали по умолчанию, а не к ошибке.

new Intl.DateTimeFormat(['xx-YY']).format(new Date());
Форматирование будет выполнено в локали по умолчанию.

Использование устаревших или нестандартных опций может не дать ожидаемого эффекта. Следует сверяться с актуальной спецификацией.

Изменения в последних версиях

В спецификации ECMAScript 2020 (ES11) были добавлены свойства dateStyle и timeStyle, которые упрощают задание предопределенных форматов.

Метод formatRange(startDate, endDate) для форматирования диапазонов дат стал доступен в ES2021 (ES12).

Поддержка новых значений для опций, таких как dayPeriod, и улучшение работы с часовыми поясами продолжает развиваться в современных браузерах и средах выполнения.

Расширенные примеры

Использование метода formatToParts для анализа частей отформатированной строки:

Пример javascript
const formatter = new Intl.DateTimeFormat('ru-RU', { month: 'long', day: 'numeric' });
console.log(formatter.formatToParts(new Date('2024-01-15')));
[
  { type: 'day', value: '15' },
  { type: 'literal', value: ' ' },
  { type: 'month', value: 'января' }
]

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

Пример javascript
const formatter = new Intl.DateTimeFormat('ru-RU', { dateStyle: 'long' });
console.log(formatter.formatRange(
  new Date('2024-01-01'),
  new Date('2024-01-15')
));
"1–15 января 2024 г."

Кастомизация с использованием календаря:

Пример javascript
new Intl.DateTimeFormat('ja-JP-u-ca-japanese', {
  era: 'long',
  year: 'numeric',
  month: 'long',
  day: 'numeric'
}).format(new Date('2024-01-15'))
"令和6年1月15日"

Форматирование с 12-часовым временем и периодом дня:

Пример javascript
new Intl.DateTimeFormat('en-US', {
  hour: 'numeric',
  minute: '2-digit',
  hour12: true,
  dayPeriod: 'short'
}).format(new Date('2024-01-15T20:30:00'))
"8:30 PM"

Настройка формата с использованием numberingSystem:

Пример javascript
new Intl.DateTimeFormat('ar-EG', {
  year: 'numeric',
  month: 'long',
  day: 'numeric',
  numberingSystem: 'arab'
}).format(new Date('2024-01-15'))
"١٥ يناير ٢٠٢٤"

Использование localeMatcher:

Пример javascript
// При недоступной локали 'ru-RU' будет использована 'en-US'
new Intl.DateTimeFormat(['ru-RU', 'en-US'], {
  dateStyle: 'full'
}).format(new Date('2024-01-15'))
"Monday, January 15, 2024" (если ru-RU не поддерживается)

JS Intl.DateTimeFormat function comments

En
Intl.DateTimeFormat Formats dates and times according to locale