В Intl.DateTimeFormat форматирование времени
определяется набором параметров, которые управляют тем, какие компоненты
времени отображаются и в каком виде. Современный API предоставляет как
детальную настройку (часы, минуты, секунды), так и высокоуровневые стили
через timeStyle, которые делегируют выбор формата
локали.
Формирование строки времени в Intl.DateTimeFormat
опирается на следующие поля:
hour — часыminute — минутыsecond — секундыfractionalSecondDigits — доли секундыtimeZoneName — отображение часового поясаconst formatter = new Intl.DateTimeFormat('ru-RU', {
hour: '2-digit',
minute: '2-digit',
second: '2-digit'
});
console.log(formatter.format(new Date()));
Такой подход даёт точный контроль над тем, какие части времени будут включены в результат.
Отображение времени зависит от параметра hour12, который
управляет системой часов:
true — 12-часовой формат (AM/PM)false — 24-часовой форматundefined — выбор по умолчанию для локалиconst fmt12 = new Intl.DateTimeFormat('en-US', {
hour: 'numeric',
minute: 'numeric',
hour12: true
});
const fmt24 = new Intl.DateTimeFormat('ru-RU', {
hour: 'numeric',
minute: 'numeric',
hour12: false
});
Во многих локалях значение по умолчанию уже соответствует культурной норме, поэтому явное указание требуется не всегда.
Современный стандарт добавляет параметр timeStyle,
который упрощает форматирование времени без необходимости перечислять
отдельные поля.
Поддерживаемые значения:
full — максимально подробное отображениеlong — расширенный форматmedium — стандартный форматshort — краткий форматconst full = new Intl.DateTimeFormat('ru-RU', {
timeStyle: 'full'
});
const short = new Intl.DateTimeFormat('ru-RU', {
timeStyle: 'short'
});
Разница между стилями определяется локалью, а не разработчиком напрямую. Это означает, что одна и та же конфигурация будет выглядеть по-разному в разных регионах.
timeStyle нельзя комбинировать с низкоуровневыми
компонентами времени (hour, minute,
second). Попытка совместного использования приводит к
ошибке.
// Некорректно
new Intl.DateTimeFormat('ru-RU', {
timeStyle: 'short',
hour: '2-digit'
});
Правильный подход — выбрать один уровень абстракции:
timeStyle)Для отображения секунд используется поле second, а для
более точного времени — fractionalSecondDigits.
const fmt = new Intl.DateTimeFormat('ru-RU', {
hour: '2-digit',
minute: '2-digit',
second: '2-digit',
fractionalSecondDigits: 3
});
Значение fractionalSecondDigits может быть:
Часовой пояс управляется через timeZoneName:
const fmt = new Intl.DateTimeFormat('ru-RU', {
hour: '2-digit',
minute: '2-digit',
timeZoneName: 'short'
});
Возможные значения:
short — сокращённое обозначениеlong — полное названиеОтображение зависит от локали и системных данных.
Локаль влияет на:
console.log(new Intl.DateTimeFormat('en-US', {
hour: 'numeric',
minute: 'numeric'
}).format(new Date()));
console.log(new Intl.DateTimeFormat('de-DE', {
hour: 'numeric',
minute: 'numeric'
}).format(new Date()));
Один и тот же объект Date может отображаться совершенно
по-разному.
Параметр hourCycle предоставляет более точное управление
циклом часов:
h11 — 0–11, без AM/PMh12 — 1–12, с AM/PMh23 — 0–23h24 — 1–24const fmt = new Intl.DateTimeFormat('en-GB', {
hour: 'numeric',
minute: 'numeric',
hourCycle: 'h23'
});
hourCycle имеет приоритет над hour12, если
они используются вместе.
Хотя timeStyle выглядит простым, его поведение зависит
от внутренней таблицы CLDR (Common Locale Data Repository). Это
означает:
Пример различий:
short может показывать 14:05medium может добавлять секунды
14:05:33long может добавлять часовой поясfull может включать полное локализованное представление
времениХотя тема относится к времени, важно учитывать взаимодействие с
dateStyle:
new Intl.DateTimeFormat('ru-RU', {
dateStyle: 'long',
timeStyle: 'short'
});
Такой режим позволяет формировать единый формат даты и времени без ручной настройки всех компонентов.
Краткие форматы:
new Intl.DateTimeFormat('ru-RU', {
timeStyle: 'short'
});
Используются в списках сообщений, уведомлениях, чатах.
Точные значения:
new Intl.DateTimeFormat('ru-RU', {
hour: '2-digit',
minute: '2-digit',
second: '2-digit',
fractionalSecondDigits: 3
});
Применяется в логировании и отладке.
Формат, зависящий от региона:
new Intl.DateTimeFormat(undefined, {
timeStyle: 'medium'
});
Позволяет автоматически адаптироваться под системную локаль пользователя.
Поведение Intl.DateTimeFormat зависит от:
Это влияет на:
timeStyletimeStyleСоздание форматтера дорого по сравнению с его использованием. Оптимальная практика:
Intl.DateTimeFormatconst fmt = new Intl.DateTimeFormat('ru-RU', {
timeStyle: 'short'
});
function render(time) {
return fmt.format(time);
}