Локализованное форматирование

Локализация в Day.js обеспечивает отображение дат и времени в соответствии с правилами конкретного языка и региона. Это включает форматирование названий месяцев, дней недели, порядок отображения компонентов даты, правила относительного времени и календарные выражения.

Day.js изначально работает с базовой (английской) локалью. Для расширения функциональности используются локали и дополнительные плагины, подключающие региональные правила форматирования.


Подключение и активация локалей

Локализация в Day.js реализуется через подключение отдельных языковых пакетов.

import dayjs from 'dayjs'
import 'dayjs/locale/ru'

dayjs.locale('ru')

После установки локали все операции форматирования начинают учитывать региональные правила.


Структура локали Day.js

Каждая локаль представляет собой объект, содержащий:

  • названия месяцев
  • сокращённые названия месяцев
  • названия дней недели
  • правила первого дня недели
  • форматы относительного времени
  • правила календарного отображения

Пример логической структуры:

{
  name: 'ru',
  months: [...],
  monthsShort: [...],
  weekdays: [...],
  weekdaysShort: [...],
  weekdaysMin: [...],
  weekStart: 1,
  relativeTime: {...}
}

Форматирование дат с учётом локали

Основной метод форматирования — format. Он использует токены, которые интерпретируются с учётом активной локали.

dayjs().format('DD MMMM YYYY')

Для английской локали результат:

22 May 2026

Для русской локали:

22 мая 2026

Разница определяется таблицами названий месяцев внутри локали.


Токены форматирования и локализация

Локализация влияет на следующие элементы:

Месяцы

  • MMMM — полное название месяца
  • MMM — сокращённое название месяца

Пример:

dayjs('2026-05-22').locale('ru').format('MMMM')

Результат:

мая

Дни недели

  • dddd — полное название дня недели
  • ddd — сокращённое название
dayjs().locale('ru').format('dddd')

Результат:

пятница

Порядок элементов даты

Локаль влияет только на отображение, а не на внутреннюю структуру объекта. Формат:

dayjs('2026-05-22').locale('ru').format('DD.MM.YYYY')

Результат:

22.05.2026

Изменение локали на лету

Локаль может изменяться динамически для отдельных вызовов.

dayjs().locale('en').format('DD MMMM YYYY')
dayjs().locale('ru').format('DD MMMM YYYY')

Каждый вызов использует свою локаль независимо от глобальной настройки.


Глобальная установка локали

Глобальная локаль влияет на все последующие операции форматирования.

dayjs.locale('ru')

dayjs().format('DD MMMM YYYY')

При этом локаль можно переопределить локально через locale().


Относительное время (Relative Time)

Для локализованного отображения относительного времени используется плагин relativeTime.

import relativeTime from 'dayjs/plugin/relativeTime'
import 'dayjs/locale/ru'

dayjs.extend(relativeTime)
dayjs.locale('ru')

Пример относительного времени

dayjs().subtract(3, 'day').fromNow()

Результат:

3 дня назад

Правила относительного времени в локали

Локаль определяет форматы:

relativeTime: {
  future: 'через %s',
  past: '%s назад',
  s: 'несколько секунд',
  m: 'минута',
  mm: '%d минут',
  h: 'час',
  hh: '%d часов',
  d: 'день',
  dd: '%d дней',
  M: 'месяц',
  MM: '%d месяцев',
  y: 'год',
  yy: '%d лет'
}

Календарное форматирование

Плагин calendar позволяет выводить даты в стиле «сегодня», «вчера», «на следующей неделе».

import calendar from 'dayjs/plugin/calendar'

dayjs.extend(calendar)
dayjs.locale('ru')

Пример календарного вывода

dayjs().add(1, 'day').calendar()

Результат:

Завтра в 14:00

Локаль определяет шаблоны:

calendar: {
  sameDay: '[Сегодня в] LT',
  nextDay: '[Завтра в] LT',
  nextWeek: 'dddd [в] LT',
  lastDay: '[Вчера в] LT',
  lastWeek: 'dddd [прошлой недели] LT',
  sameElse: 'L'
}

Пользовательская настройка локали

Локаль может быть переопределена или расширена.

dayjs.locale('ru', {
  monthsShort: ['янв', 'фев', 'мар', 'апр', 'май', 'июн',
                'июл', 'авг', 'сен', 'окт', 'ноя', 'дек']
})

Неделя и начало недели

Локаль задаёт первый день недели:

weekStart: 1

Значение:

  • 0 — воскресенье
  • 1 — понедельник

Это влияет на:

  • расчёт недельных интервалов
  • календарные отображения
  • плагины работы с неделями

Форматирование с учётом времени суток

Некоторые локали используют 12- или 24-часовой формат.

dayjs().format('HH:mm')

или

dayjs().format('h:mm A')

Локаль определяет корректность маркеров AM/PM.


Локализованный вывод дат без форматирования

Плагин localizedFormat добавляет стандартные форматы:

import localizedFormat from 'dayjs/plugin/localizedFormat'

dayjs.extend(localizedFormat)
dayjs.locale('ru')

Пример

dayjs().format('L')

Результат:

22.05.2026

Другие форматы:

  • LT — время
  • LTS — время с секундами
  • LL — полная дата
  • LLL — дата и время
  • LLLL — расширенный формат

Особенности хранения и вычислений

Локализация не влияет на:

  • хранение даты (всегда UTC/Unix внутри)
  • арифметику дат
  • сравнение значений

Влияние распространяется только на слой отображения.

dayjs('2026-05-22T10:00:00Z').locale('ru').add(1, 'day')

Результат остаётся корректным независимо от локали.


Работа с множественными локалями

Приложения с мультиязычностью часто переключают локали динамически.

const lang = 'ru'

dayjs.locale(lang)

или на уровне компонента:

dayjs().locale('ru').format('MMMM')
dayjs().locale('en').format('MMMM')

Поведение при отсутствии локали

Если локаль не загружена:

  • используется английская локаль по умолчанию
  • форматирование возвращается к стандартным значениям
  • относительное время отображается на английском
dayjs().format('MMMM')
May

Совместимость локалей и плагинов

Некоторые плагины требуют локализацию для полного эффекта:

  • relativeTime — текстовые выражения времени
  • calendar — шаблоны событий
  • localizedFormat — предустановленные форматы
  • updateLocale — модификация существующих правил

Обновление локали через updateLocale

Плагин updateLocale позволяет частично изменить правила:

import updateLocale from 'dayjs/plugin/updateLocale'

dayjs.extend(updateLocale)

dayjs.updateLocale('ru', {
  monthsShort: ['янв', 'фев', 'мар', 'апр', 'май', 'июн']
})

Изменения применяются без полной замены локали.