Локализация в date-fns построена вокруг концепции явной передачи локали в функции форматирования и вычисления дат. Вместо глобального состояния используется объект locale, содержащий правила форматирования, склонения и представления времени для конкретного языка и региона.
Каждая локаль представляет собой модуль, включающий набор функций:
Такой подход делает поведение библиотеки предсказуемым и удобным для tree-shaking в сборщиках.
Каждая локаль в date-fns представляет собой JavaScript-объект с фиксированной структурой:
code — строковый идентификатор языка и регионаformatDistance — правила для выражений типа «2 минуты
назад»formatLong — шаблоны длинных форматов датformatRelative — правила для относительных дат (вчера,
сегодня, завтра)localize — локализация месяцев, дней недели и
порядковых чиселmatch — парсинг строковых представлений датПримерно это выглядит как набор функций и словарей, объединённых в один объект, который затем используется внутри форматирующих функций.
Локали в date-fns поставляются как отдельные модули. Это важно для уменьшения размера бандла и контроля над импортируемыми данными.
Импорт выполняется напрямую из пакета локалей:
import { ru } from 'date-fns/locale'
или более точечно:
import ru from 'date-fns/locale/ru'
Выбор способа импорта зависит от версии сборки и конфигурации модульной системы.
Основной механизм локализации проявляется в функции
format. Локаль передаётся через объект опций.
import { format } from 'date-fns'
import { ru } from 'date-fns/locale'
format(new Date(2026, 0, 24), 'EEEE, d MMMM yyyy', {
locale: ru
})
Форматирование строк учитывает:
Без передачи локали используется локаль по умолчанию (обычно английская).
Для устранения необходимости постоянной передачи locale
в каждую функцию применяется глобальная настройка через
setDefaultOptions.
import { setDefaultOptions } from 'date-fns'
import { ru } from 'date-fns/locale'
setDefaultOptions({ locale: ru })
После этого все функции форматирования используют указанную локаль автоматически.
Механизм основан на внутреннем контексте библиотеки и применяется ко всем операциям, поддерживающим опции.
Функция formatDistance используется для отображения
разницы между датами в человекочитаемом виде.
import { formatDistance } from 'date-fns'
import { ru } from 'date-fns/locale'
formatDistance(new Date(2026, 0, 20), new Date(2026, 0, 24), {
locale: ru,
addSuffix: true
})
Локаль определяет:
Каждая локаль содержит собственную функцию
formatDistance, возвращающую корректную грамматическую
форму.
Функция formatRelative формирует выражения вроде «вчера
в 14:00» или «завтра в 10:00».
import { formatRelative } from 'date-fns'
import { ru } from 'date-fns/locale'
formatRelative(new Date(2026, 0, 25, 10, 0), new Date(2026, 0, 24), {
locale: ru
})
Локаль определяет шаблоны для разных временных диапазонов:
Каждый диапазон имеет собственную строку форматирования.
Компонент localize внутри локали отвечает за
преобразование числовых значений в текстовые представления.
Он содержит:
Пример использования происходит не напрямую, а через форматирующие токены:
import { format } from 'date-fns'
import { ru } from 'date-fns/locale'
format(new Date(2026, 4, 15), 'd MMMM', { locale: ru })
Результат зависит от локализованных массивов внутри объекта
ru.
Форматные токены в date-fns интерпретируются с учётом локали. Особенно это касается:
MMMM — полное название месяцаMMM — сокращённое название месяцаEEEE — день неделиaa / aaa — периоды сутокКаждая локаль определяет собственные словари, которые подставляются при обработке токенов.
Локали реализованы как независимые модули, что позволяет сборщикам (Webpack, Vite, Rollup) удалять неиспользуемые языки из итогового бандла.
Импорт конкретной локали:
import { fr } from 'date-fns/locale'
или:
import fr from 'date-fns/locale/fr'
При таком подходе в сборку попадает только используемый языковой пакет, а не весь набор локалей.
Поддержка локалей присутствует в большинстве функций:
formatformatDistanceformatRelativeformatDistanceToNowformatDuration (в некоторых версиях через
дополнительные пакеты)Передача осуществляется через объект опций:
{
locale: <localeObject>
}
Отсутствие параметра приводит к использованию дефолтного английского поведения.
Архитектура допускает создание собственных локалей. Для этого используется тот же интерфейс, что и у встроенных модулей.
Структура должна включать:
formatDistanceformatLongformatRelativelocalizematchПримерно это выглядит как реализация аналогичного объекта с собственными правилами грамматики и форматирования.
При использовании комбинированных форматов, например:
format(new Date(), "EEEE, d MMMM yyyy 'в' HH:mm", { locale })
локаль применяется только к токенам, связанным с языковыми сущностями. Литералы в кавычках остаются неизменными.
Таким образом достигается смешивание локализованных и фиксированных частей строки.
Некоторые локали различаются не только языком, но и правилами:
Например, различия между en-US и en-GB
отражаются в formatLong и formatRelative.
При отсутствии параметра locale применяется базовая
английская локализация. Это влияет на:
Внутренне используется дефолтный объект, встроенный в библиотеку, без необходимости дополнительных импортов.
Локализация применяется не только к форматированию отображения, но и к пользовательским интерфейсам, где даты выводятся динамически:
В каждом случае один и тот же объект локали обеспечивает согласованность языкового представления дат по всей системе.