В библиотеке FormatJS ключевую роль в работе с датами и временем в
React-интерфейсах играют компоненты FormattedDate и
FormattedTime, предоставляемые через пакет
react-intl. Эти компоненты являются декларативной обёрткой
над API Intl.DateTimeFormat и позволяют выводить
локализованные представления даты и времени без ручного форматирования
строк.
Оба компонента ориентированы на интеграцию в React и обеспечивают
единообразное отображение временных значений в зависимости от текущей
локали, заданной через IntlProvider.
В основе компонентов лежит стандарт ECMAScript Internationalization API:
Intl.DateTimeFormat — формирование строк даты и времени
с учётом локалиIntlProvider — источник текущей локали и
настроек форматированияКомпоненты FormattedDate и FormattedTime
представляют собой специализированные обёртки, разделяющие
ответственность:
FormattedDate — работа с календарной датой (день,
месяц, год)FormattedTime — работа со временем (часы, минуты,
секунды)Компонент FormattedDate используется для отображения
даты в локализованном формате.
При отсутствии дополнительных параметров форматирование полностью определяется текущей локалью:
import { FormattedDate } from "react-intl";
<FormattedDate value={new Date(2026, 0, 15)} />
Результат зависит от языка:
1/15/202615.1.202615.01.2026valuevalue принимает:
Date<FormattedDate value={Date.now()} />
Внутри происходит преобразование в Date и передача в
Intl.DateTimeFormat.
Компонент поддерживает стандартные опции
Intl.DateTimeFormatOptions.
<FormattedDate
value={new Date()}
dateStyle="full"
/>
Возможные значения:
full — полное текстовое представлениеlong — расширенный форматmedium — стандартный форматshort — краткий форматПример:
<FormattedDate value={new Date()} dateStyle="full" />
Можно задавать отдельные части даты:
<FormattedDate
value={new Date()}
year="numeric"
month="long"
day="2-digit"
/>
Результат будет зависеть от локали, например:
15 января 2026 г.January 15, 2026Хотя FormattedDate ориентирован на дату, он наследует
поведение Intl.DateTimeFormat, включая
timeZone:
<FormattedDate
value={new Date()}
timeZone="UTC"
year="numeric"
month="2-digit"
day="2-digit"
/>
Это особенно важно при серверном рендеринге, где локальное время может отличаться от пользовательского.
Вместо прямого вывода можно использовать render-prop:
<FormattedDate
value={new Date()}
>
{(formattedDate) => (
<span>{formattedDate}</span>
)}
</FormattedDate>
Это позволяет:
FormattedTime отвечает за отображение времени суток.
import { FormattedTime } from "react-intl";
<FormattedTime value={new Date()} />
Результат:
3:45 PM15:45valueКак и в FormattedDate, принимает:
Date<FormattedTime value={Date.now()} />
<FormattedTime
value={new Date()}
timeStyle="medium"
/>
Поддерживаются:
fulllongmediumshortРазница заключается в наличии секунд и формате отображения.
<FormattedTime
value={new Date()}
hour="2-digit"
minute="2-digit"
second="2-digit"
/>
Пример вывода:
03:45:12 PM15:45:12Формат зависит от локали, но может быть переопределён:
<FormattedTime
value={new Date()}
hour="numeric"
hour12={false}
minute="2-digit"
/>
hour12={false} → принудительно 24-часовой формат<FormattedTime
value={new Date()}
timeZone="Asia/Almaty"
/>
Это гарантирует корректное отображение времени независимо от системного времени пользователя.
<FormattedTime value={new Date()}>
{(formattedTime) => (
<time>{formattedTime}</time>
)}
</FormattedTime>
Используется в случаях:
<time>Оба компонента зависят от контекста:
import { IntlProvider } from "react-intl";
<IntlProvider locale="ru-RU">
<App />
</IntlProvider>
Без IntlProvider используется системная локаль браузера,
что приводит к непредсказуемому отображению в разных окружениях.
FormattedDate:
FormattedTime:
| Параметр | FormattedDate | FormattedTime |
|---|---|---|
| year | да | нет |
| month | да | нет |
| day | да | нет |
| hour | нет | да |
| minute | нет | да |
| second | нет | да |
| dateStyle | да | нет |
| timeStyle | нет | да |
При смене locale в IntlProvider компоненты
автоматически перерендериваются:
<IntlProvider locale="fr-FR">
Это приводит к:
При SSR важно учитывать:
timeZone, если требуется фиксированное
значениеКомпоненты оптимизированы следующим образом:
Intl.DateTimeFormat внутри библиотекиОднако частое создание новых Date внутри render-функции
может приводить к лишним перерендерингам.
Date без явного
преобразованияIntlProviderОба компонента фактически выполняют следующие шаги:
Intl.DateTimeFormat(locale, options)format(value)Часто используются как базовые строительные блоки:
Их декларативность делает их предпочтительнее ручного форматирования через утилиты.