Библиотека date-fns построена вокруг модульного подхода: каждая функция подключается отдельно, а локали поставляются как самостоятельные модули. Это позволяет минимизировать размер бандла и точно контролировать используемые языковые ресурсы.
Локаль в date-fns — это объект, содержащий правила форматирования дат: названия месяцев, дней недели, правила склонений, форматы отображения времени и особенности календаря конкретного языка.
Ключевая особенность подхода: локаль не активируется автоматически, она передаётся явно или задаётся как глобальная настройка.
Каждая локаль находится в отдельном пакете внутри
date-fns/locale.
Примеры:
date-fns/locale/ru — русский языкdate-fns/locale/en-US — американский английскийdate-fns/locale/de — немецкий языкКаждая локаль экспортирует объект с набором правил:
{
code: 'ru',
formatDistance: { ... },
formatLong: { ... },
formatRelative: { ... },
localize: { ... },
match: { ... },
options: { ... }
}
Этот объект используется всеми функциями форматирования внутри библиотеки.
Наиболее распространённый способ — передача локали через опции функции.
import { format } from 'date-fns'
import { ru } from 'date-fns/locale'
const date = new Date(2026, 0, 24)
const result = format(date, 'EEEE, d MMMM yyyy', {
locale: ru
})
console.log(result)
При использовании русской локали:
В приложениях часто требуется поддержка нескольких языков одновременно.
import { format } from 'date-fns'
import { ru } from 'date-fns/locale'
import { enUS } from 'date-fns/locale'
import { de } from 'date-fns/locale'
function formatByLocale(date, localeCode) {
const locales = {
ru,
en: enUS,
de
}
return format(date, 'PPPP', {
locale: locales[localeCode]
})
}
Такой подход позволяет централизовать выбор локали на уровне приложения.
date-fns поддерживает настройку опций по умолчанию через
setDefaultOptions.
import { format, setDefaultOptions } from 'date-fns'
import { ru } from 'date-fns/locale'
setDefaultOptions({
locale: ru
})
const date = new Date(2026, 0, 24)
console.log(format(date, 'PPPP'))
После установки:
locale в каждом вызове
отпадаетВажно учитывать: глобальные настройки применяются в пределах текущего модуля, что критично при серверном рендеринге.
Локаль влияет не только на названия месяцев и дней, но и на:
formatRelative)formatDistance)formatLong)import { formatRelative } from 'date-fns'
import { ru } from 'date-fns/locale'
const date = new Date()
const result = formatRelative(date, new Date(), {
locale: ru
})
console.log(result)
Результат может быть вида: сегодня в 12:00
date-fns спроектирована так, чтобы поддерживать tree-shaking.
Корректный импорт:
import { ru } from 'date-fns/locale/ru'
или
import { ru } from 'date-fns/locale'
При использовании bundler’ов (Vite, Webpack, Rollup) важно:
requireНеправильный подход:
import * as locales from 'date-fns/locale'
Это приводит к включению всех языков в бандл.
При серверном рендеринге локаль должна быть определена на каждый запрос отдельно.
Типичный подход:
import { format } from 'date-fns'
import { ru, enUS } from 'date-fns/locale'
export function renderDate(date, lang) {
const localeMap = {
ru,
en: enUS
}
return format(date, 'PPPP', {
locale: localeMap[lang] || enUS
})
}
Особенность:
Некоторые форматы зависят от локали напрямую.
format(date, 'PPP', { locale: ru })
PPP — локализованный длинный формат датыДля разных языков результат одного и того же шаблона будет отличаться:
24 января 2026 г.January 24th, 2026format(date, 'PPPP')
Результат будет в английской локали по умолчанию.
import { ru } from 'date-fns'
Такой импорт некорректен, локаль не будет подключена.
import * as locales from 'date-fns/locale'
Приводит к увеличению размера бандла и потере tree-shaking.
setDefaultOptions({ locale: ru })
format(date, 'PPPP', { locale: enUS })
Локальная настройка всегда переопределяет глобальную, что может создавать неоднозначное поведение при масштабировании приложения.
Система локалей построена на нескольких уровнях:
localize — перевод единиц времениformatDistance — расстояния между датамиformatRelative — относительные выраженияformatLong — длинные форматы датmatch — парсинг строк в датыТакой подход делает локализацию не просто переводом строк, а полноценной языковой моделью форматирования дат.