В экосистеме FormatJS работа с датой и временем строится вокруг
стандарта Intl и расширений, обеспечивающих унифицированное
форматирование в разных локалях. Комбинированные форматы даты и времени
представляют собой синтез двух независимых частей — календарной даты и
времени суток — в единое локализованное представление, учитывающее
культурные нормы отображения.
Основой всех операций форматирования служит
Intl.DateTimeFormat, который принимает набор опций,
разделённых на две группы:
year, month,
day, weekday)hour, minute,
second, hour12,
timeZoneName)Комбинированный формат формируется простым объединением этих групп в одном объекте конфигурации:
const formatter = new Intl.DateTimeFormat('ru-RU', {
year: 'numeric',
month: 'long',
day: '2-digit',
hour: '2-digit',
minute: '2-digit'
});
formatter.format(new Date());
Результат зависит от локали: порядок элементов, разделители и даже логика отображения времени определяются языковыми правилами, а не кодом приложения.
Комбинированный формат не является отдельным типом — он строится из двух независимых подсистем:
При объединении действует единый механизм разрешения конфликтов:
Например:
new Intl.DateTimeFormat('en-US', {
dateStyle: 'full',
timeStyle: 'short'
}).format(new Date());
Использование dateStyle и timeStyle
упрощает создание комбинированных форматов без ручного перечисления
полей.
Современные реализации Intl поддерживают абстракции:
dateStyle:
"full" | "long" | "medium" | "short"timeStyle:
"full" | "long" | "medium" | "short"Комбинация этих параметров создаёт предсказуемый локализованный формат:
const fmt = new Intl.DateTimeFormat('fr-FR', {
dateStyle: 'long',
timeStyle: 'short'
});
fmt.format(new Date());
Эти параметры исключают необходимость вручную комбинировать
year, month, day,
hour и другие поля.
В составе FormatJS (через react-intl) комбинированные
форматы реализуются через компоненты и API:
<FormattedDate><FormattedTime><FormattedDateTime>formatDateformatTimeformatDateTimeКомпонент <FormattedDateTime> объединяет две
подсистемы форматирования:
<FormattedDateTime
value={new Date()}
year="numeric"
month="long"
day="2-digit"
hour="2-digit"
minute="2-digit"
/>
Внутри происходит делегирование в Intl.DateTimeFormat,
где параметры даты и времени агрегируются в единый конфиг.
Функция formatDateTime выполняет нормализацию входных
параметров:
Intl.DateTimeFormatСхематически:
formatDateTime(value, options) {
const dateOptions = extractDate(options);
const timeOptions = extractTime(options);
return new Intl.DateTimeFormat(locale, {
...dateOptions,
...timeOptions
}).format(value);
}
Конфликты между опциями разрешаются по приоритету времени, если параметры перекрываются.
Комбинированные форматы полностью зависят от локали:
Пример различий:
ru-RU: 29 мая 2026 г., 14:30en-US: May 29, 2026, 2:30 PMde-DE: 29. Mai 2026, 14:30Эти правила не задаются в коде и не подлежат ручной фиксации без необходимости.
Для точного контроля над комбинированными форматами используется
formatToParts, возвращающий структурированный массив:
const parts = new Intl.DateTimeFormat('en-US', {
year: 'numeric',
month: 'short',
day: '2-digit',
hour: '2-digit',
minute: '2-digit'
}).formatToParts(new Date());
Результат содержит элементы:
yearmonthdayhourminuteliteralТакой подход позволяет:
При объединении даты и времени критическую роль играет
timeZone:
new Intl.DateTimeFormat('ru-RU', {
dateStyle: 'medium',
timeStyle: 'short',
timeZone: 'Europe/Moscow'
});
Особенности:
timeZoneКомбинированный формат всегда интерпретирует момент времени как единый timestamp.
Комбинированный формат допускает смешение:
dateStyle + timeStyle (высокоуровневый режим)Если заданы оба стиля и отдельные поля, приоритет имеют explicit-опции:
{
dateStyle: 'long',
timeStyle: 'short',
month: 'numeric'
}
В таком случае month: 'numeric' переопределяет часть
dateStyle.
FormatJS поддерживает ICU MessageFormat, где комбинированные даты часто используются внутри сообщений:
const message = `
{date, date, long} в {date, time, short}
`;
Здесь:
date, date отвечает за календарную частьdate, time отвечает за временную частьТакой подход особенно важен для динамических интерфейсов и уведомлений.
На практике выделяются устойчивые паттерны:
Если задан только набор date-опций и отсутствуют time-опции, комбинирование не происходит. Аналогично:
dateStyle → датаtimeStyle → времяВнутренне FormatJS:
IntldateStyle/timeStyleКомбинированные форматы выступают как слой абстракции над нативным API, снижая необходимость ручного управления деталями локализации.
Изменение locale приводит к пересозданию форматтера:
new Intl.DateTimeFormat('ja-JP', {
dateStyle: 'long',
timeStyle: 'short'
});
Результат радикально отличается от западных локалей, несмотря на одинаковую структуру данных.
Для высоконагруженных приложений применяется:
Intl.DateTimeFormatЭто снижает стоимость многократного форматирования в UI-компонентах.