Day.js использует модель локалей как фундаментальный слой форматирования дат, парсинга и отображения временных значений. Локали определяют правила представления дат в различных языках и регионах: названия месяцев и дней недели, форматы относительного времени, порядок компонентов даты, особенности сокращений и грамматические формы.
Система локалей построена поверх неизменяемого ядра библиотеки и подключается как расширяемый модуль. Базовая идея заключается в том, что сам движок работы с датами не содержит языковых данных — они подключаются отдельно через локали и плагины.
Локаль в Day.js представляет собой объект конфигурации, включающий:
Такая архитектура позволяет минимизировать размер бандла: включаются только нужные языки.
По умолчанию используется английская локаль en. Это
означает:
a few seconds ago,
in 3 hoursimport dayjs from 'dayjs'
dayjs().format('MMMM D, YYYY')
// March 10, 2026
Без явного подключения дополнительных локалей все языковые операции остаются в рамках английского набора правил.
Локали в Day.js подключаются модульно. Каждая локаль представляет собой отдельный файл.
import dayjs from 'dayjs'
import 'dayjs/locale/ru'
dayjs.locale('ru')
dayjs().format('D MMMM YYYY')
// 10 марта 2026
Подключение происходит в два этапа:
dayjs.locale()При этом локаль применяется глобально для всех последующих операций форматирования.
Каждая локаль представляет собой структурированный объект с предсказуемыми полями:
{
name: 'ru',
weekdays: ['воскресенье', 'понедельник', ...],
months: ['январь', 'февраль', ...],
formats: {
LT: 'HH:mm',
LTS: 'HH:mm:ss',
L: 'DD.MM.YYYY',
LL: 'D MMMM YYYY',
LLL: 'D MMMM YYYY HH:mm',
LLLL: 'dddd, D MMMM YYYY HH:mm'
},
relativeTime: {
future: 'через %s',
past: '%s назад',
s: 'несколько секунд',
m: 'минута',
mm: '%d минут',
h: 'час',
hh: '%d часов',
d: 'день',
dd: '%d дней',
M: 'месяц',
MM: '%d месяцев',
y: 'год',
yy: '%d лет'
},
ordinal: n => `${n}-й`,
week: {
dow: 1
}
}
Каждое поле отвечает за отдельный аспект локализации.
Поле formats задаёт стандартизированные шаблоны
отображения. Эти форматы используются внутри метода
format() при передаче предустановленных токенов.
Основные уровни:
LT — времяL — короткая датаLL — расширенная датаLLL — дата и времяLLLL — полное текстовое представлениеПример различий между локалями:
dayjs.locale('en')
dayjs().format('LL')
// March 10, 2026
dayjs.locale('ru')
dayjs().format('LL')
// 10 марта 2026
Локаль изменяет не только слова, но и синтаксис представления даты.
Функциональность относительного времени активируется через плагин
relativeTime, который тесно связан с локалями.
import relativeTime from 'dayjs/plugin/relativeTime'
dayjs.extend(relativeTime)
После этого локаль начинает управлять формированием строк:
dayjs.locale('ru')
dayjs().subtract(5, 'minute').fromNow()
// 5 минут назад
dayjs().add(2, 'hour').fromNow()
// через 2 часа
Локаль определяет:
Поле ordinal отвечает за форматирование порядковых
числительных:
ordinal: n => `${n}-й`
Используется в форматах, где присутствует позиционная нумерация:
dayjs('2026-03-10').format('DDo')
// 10-й
В разных локалях реализация ординалов может значительно отличаться:
1st, 2nd, 3rd1-й, 2-й, 3-й1er, 2eЛокаль определяет начало недели через поле week.dow:
week: {
dow: 1
}
Это влияет на:
Пример:
dayjs.locale('ru')
// неделя начинается с понедельника
Day.js позволяет динамически изменять локаль без пересоздания объектов дат.
dayjs.locale('en')
const d = dayjs()
dayjs.locale('ru')
d.format('LL')
// формат изменится на русском
Важно, что объект даты не содержит локаль внутри себя — локаль применяется при каждом вызове форматирования.
Существует возможность задавать локаль для конкретного экземпляра:
dayjs().locale('ru').format('LL')
Это позволяет комбинировать разные локали в одном приложении без глобального переключения.
Локали можно определять вручную, создавая собственные конфигурации:
import dayjs from 'dayjs'
dayjs.locale({
name: 'custom',
months: ['M1', 'M2', 'M3'],
weekdays: ['D0', 'D1', 'D2', 'D3', 'D4', 'D5', 'D6'],
relativeTime: {
future: '+%s',
past: '-%s',
s: 'now',
m: '1m',
mm: '%dm',
h: '1h',
hh: '%dh',
d: '1d',
dd: '%dd',
M: '1mo',
MM: '%dmo',
y: '1y',
yy: '%dy'
}
}, null, true)
Такие локали используются для:
Хотя основная роль локалей — форматирование, некоторые плагины используют их для парсинга.
Особенно это важно для:
customParseFormatlocalizedFormatПример:
import customParseFormat from 'dayjs/plugin/customParseFormat'
dayjs.extend(customParseFormat)
dayjs('10 марта 2026', 'D MMMM YYYY', 'ru')
Здесь локаль критична для интерпретации текстовых месяцев.
Модель подключаемых локалей в Day.js ориентирована на минимизацию размера сборки:
Пример оптимизированного импорта:
import 'dayjs/locale/ru'
import 'dayjs/locale/de'
Это позволяет ограничить итоговый bundle только нужными локалями.
Если подключено несколько локалей, активной считается последняя установленная:
dayjs.locale('en')
dayjs.locale('ru')
Форматирование будет использовать русскую локаль.
Для предотвращения конфликтов в крупных приложениях применяется явное
управление контекстом локали через .locale() на уровне
экземпляра.
В интерфейсах с динамическим языковым переключением локали используются как реактивный слой:
Это обеспечивает согласованность отображения дат с остальным интерфейсом.
Несмотря на гибкость, модель имеет ограничения:
Эти ограничения компенсируются расширяемостью и возможностью кастомизации.
В архитектуре приложений локали в Day.js выступают как слой представления данных:
Такое разделение упрощает: