Локализация в Day.js опирается на систему языковых пакетов (locale) и набор встроенных механизмов форматирования, которые позволяют адаптировать даты к культурным и языковым особенностям. Основная идея заключается в том, что один и тот же объект даты может отображаться по-разному в зависимости от выбранного локаля, при этом логика работы с датой остаётся неизменной.
Day.js хранит локализованные паттерны в виде структур, описывающих
названия месяцев, дней недели, правила склонений, форматы времени и
правила относительных выражений. Переключение локали влияет не только на
вывод format(), но и на поведение таких функций, как
calendar(), fromNow() и ряда плагинов.
Каждая локаль в Day.js представляет собой объект, содержащий:
Подключение локали осуществляется явно:
import dayjs from 'dayjs'
import 'dayjs/locale/ru'
dayjs.locale('ru')
После этого все операции форматирования начинают использовать русские паттерны.
Метод format() использует стандартные токены Day.js,
однако локаль влияет на текстовые элементы, такие как названия месяцев и
дней недели.
dayjs('2026-05-23').format('DD MMMM YYYY')
Без локали:
23 May 2026
С русской локалью:
23 мая 2026
Локализация применяется только к текстовым компонентам, числовые значения остаются неизменными.
Плагин localizedFormat добавляет набор предопределённых
паттернов, зависящих от локали. Он позволяет использовать форматы,
аналогичные Moment.js, без необходимости вручную задавать токены.
Подключение:
import localizedFormat from 'dayjs/plugin/localizedFormat'
dayjs.extend(localizedFormat)
Использование:
dayjs().format('L') // локализованная дата
dayjs().format('LL') // расширенный формат даты
dayjs().format('LLL') // дата + время
dayjs().format('LLLL') // полное текстовое представление
Значения этих паттернов зависят от активной локали:
L — краткая датаLL — расширенная датаLLL — дата и времяLLLL — полное текстовое представление с днём
неделиКалендарное форматирование реализуется через плагин
calendar, который позволяет отображать дату относительно
текущего момента.
import calendar from 'dayjs/plugin/calendar'
dayjs.extend(calendar)
Пример:
dayjs().calendar(dayjs('2026-05-23'))
Локаль определяет, как именно интерпретируются временные рамки:
Пример вывода в русской локали:
Сегодня в 14:30
Вчера в 18:00
23 мая в 12:00
Каждая локаль содержит набор шаблонов для sameDay,
nextDay, lastDay, nextWeek,
lastWeek, sameElse.
Одним из ключевых локализованных паттернов является представление времени в относительном виде.
Подключение:
import relativeTime from 'dayjs/plugin/relativeTime'
dayjs.extend(relativeTime)
Использование:
dayjs().fromNow()
Примеры вывода:
Локаль содержит правила склонения и формы слов для разных диапазонов времени. Например, для русского языка важно различие между:
Эти правила задаются внутри локали как массивы форм:
relativeTime: {
future: 'через %s',
past: '%s назад',
s: 'несколько секунд',
m: 'минуту',
mm: '%d минут',
h: 'час',
hh: '%d часов'
}
Day.js позволяет модифицировать существующие локали без их полного переопределения.
import updateLocale from 'dayjs/plugin/updateLocale'
dayjs.extend(updateLocale)
Изменение форматов:
dayjs.updateLocale('ru', {
monthsShort: [
'янв', 'фев', 'мар', 'апр', 'май', 'июн',
'июл', 'авг', 'сен', 'окт', 'ноя', 'дек'
]
})
Можно изменять:
Этот механизм используется для тонкой настройки корпоративных интерфейсов или специфических доменных форматов.
Day.js использует универсальные токены (YYYY,
MM, DD), но локаль влияет на интерпретацию
текстовых сегментов.
Особое значение имеют:
MMM — сокращённое название месяцаMMMM — полное название месяцаddd — сокращённый день неделиdddd — полный день неделиПример:
dayjs('2026-05-23').format('dddd, D MMMM')
В русской локали:
суббота, 23 мая
Некоторые локали, включая русскую, требуют сложной морфологии. Day.js
решает это через множественные формы в relativeTime и
ordinal.
Пример ordinal:
dayjs.extend(require('dayjs/plugin/advancedFormat'))
Хотя Day.js не включает полноценную грамматику, локаль может задавать правила:
ordinal: function (n) {
return n + '-й'
}
Это влияет на такие форматы:
dayjs().format('Do')
Результат:
23-й
Day.js позволяет динамически переключать локали:
dayjs.locale('en')
dayjs.locale('ru')
При этом каждый объект даты наследует активную локаль на момент вызова форматирования, а не на момент создания.
const date = dayjs('2026-05-23')
dayjs.locale('en')
date.format('LL')
dayjs.locale('ru')
date.format('LL')
Результаты будут различаться без изменения исходного объекта.
Создание собственной локали позволяет полностью контролировать форматирование:
import dayjs from 'dayjs'
dayjs.locale({
name: 'custom',
months: ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12'],
monthsShort: ['01', '02', '03', '04', '05', '06', '07', '08', '09', '10', '11', '12'],
weekdays: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],
weekdaysShort: ['Su', 'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa'],
relativeTime: {
future: '+%s',
past: '-%s',
s: 'now',
m: '1m',
mm: '%dm',
h: '1h',
hh: '%dh'
}
})
Такая конфигурация используется в интерфейсах, где требуется сокращённое или техническое отображение дат.
Локализация в Day.js не ограничивается базовым форматированием. Она распространяется на плагины:
relativeTime — формирование фраз времениcalendar — контекстное отображение датlocalizedFormat — предопределённые шаблоныadvancedFormat — расширенные токеныВсе плагины используют единый источник локали, что обеспечивает консистентность отображения во всех частях системы.
При серверном рендеринге важно фиксировать локаль до генерации строки:
dayjs.locale('ru')
const html = dayjs().format('LLLL')
Если локаль изменится на клиенте, уже сгенерированная строка не обновится автоматически. Это важно учитывать при гидрации интерфейсов и синхронизации состояния даты.
Day.js использует следующий порядок применения локали:
dayjs.locale()en)Это позволяет комбинировать разные языки в рамках одного приложения без конфликтов между форматами.