В Day.js локаль представляет собой объект конфигурации, который определяет правила форматирования дат и времени: названия месяцев и дней недели, правила склонений, формат относительного времени, порядок недели и дополнительные языковые особенности. В отличие от некоторых библиотек, Day.js не создает жестких копий локалей при каждом изменении — используется модель расширения и частичного переопределения.
Каждая локаль хранится под строковым идентификатором
('en', 'ru', 'de' и т.д.) и может
быть изменена во время выполнения программы. Это делает возможной тонкую
настройку поведения без необходимости создания новой локали с нуля.
Локаль в Day.js представляет собой объект со следующими ключевыми компонентами:
months — названия месяцевmonthsShort — сокращенные названия месяцевweekdays — дни неделиweekdaysShort — сокращенные дни неделиweekdaysMin — минимальные обозначения днейlongDateFormat — шаблоны форматирования датrelativeTime — правила отображения относительного
времениordinal — функция формирования порядковых чиселweekStart — первый день неделиformats (в некоторых локалях через плагины или
расширения)Эти поля формируют основу поведения форматирования и парсинга.
Основной способ изменения уже существующей локали — использование
метода updateLocale.
Метод работает по принципу глубокого частичного слияния: переданные поля переопределяют только указанные части локали, не затрагивая остальные.
dayjs.updateLocale('ru', {
months: ['Янв', 'Фев', 'Мар', 'Апр', 'Май', 'Июн',
'Июл', 'Авг', 'Сен', 'Окт', 'Ноя', 'Дек']
})
В данном случае изменяется только массив месяцев, остальные настройки
локали ru сохраняются без изменений.
Частый сценарий — адаптация локали под специфический формат вывода (например, сокращения для UI или нестандартные подписи).
dayjs.updateLocale('en', {
months: [
'Jan_UX', 'Feb_UX', 'Mar_UX', 'Apr_UX',
'May_UX', 'Jun_UX', 'Jul_UX', 'Aug_UX',
'Sep_UX', 'Oct_UX', 'Nov_UX', 'Dec_UX'
]
})
dayjs.updateLocale('en', {
weekdays: [
'Sunday*', 'Monday*', 'Tuesday*',
'Wednesday*', 'Thursday*',
'Friday*', 'Saturday*'
]
})
Важно учитывать, что Day.js использует индексацию с воскресенья как нулевого элемента.
longDateFormat определяет, как интерпретируются
стандартные токены форматирования:
LT — времяLTS — время с секундамиL — датаLL — расширенная датаLLL — дата и времяLLLL — полное текстовое представлениеdayjs.updateLocale('en', {
longDateFormat: {
LT: 'HH:mm',
LTS: 'HH:mm:ss',
L: 'YYYY/MM/DD',
LL: 'D MMMM YYYY',
LLL: 'D MMMM YYYY HH:mm',
LLLL: 'dddd, D MMMM YYYY HH:mm'
}
})
Изменение этих значений напрямую влияет на результат методов
.format() при использовании соответствующих токенов.
Один из наиболее важных блоков локали — relativeTime. Он
определяет, как Day.js отображает разницу между датами.
Структура включает ключи:
futurepastsmmmhhhdddMMMyyydayjs.updateLocale('en', {
relativeTime: {
future: 'через %s',
past: '%s назад',
s: 'несколько секунд',
m: 'минута',
mm: '%d минут',
h: 'час',
hh: '%d часов',
d: 'день',
dd: '%d дней',
M: 'месяц',
MM: '%d месяцев',
y: 'год',
yy: '%d лет'
}
})
Формат %d используется как плейсхолдер для числового
значения.
ordinal отвечает за преобразование чисел в порядковые
формы (1st, 2nd, 3rd и т.д.).
dayjs.updateLocale('en', {
ordinal: function (n) {
return `${n}-й`
}
})
Этот механизм особенно важен для языков с развитой системой склонений.
Поле weekStart управляет началом недели:
0 — воскресенье1 — понедельник6 — субботаdayjs.updateLocale('en', {
weekStart: 1
})
Это влияет на работу календарных вычислений, таких как
.startOf('week').
Механизм updateLocale не заменяет объект целиком. Он
выполняет частичное слияние:
dayjs.updateLocale('en', {
relativeTime: {
mm: '%d minutes (custom)'
}
})
Здесь изменяется только одно правило, остальные сохраняются.
Локаль может быть изменена несколько раз подряд. Каждое последующее изменение накладывается поверх предыдущего состояния.
dayjs.updateLocale('en', {
monthsShort: ['J', 'F', 'M']
})
dayjs.updateLocale('en', {
weekdaysMin: ['Su', 'Mo', 'Tu']
})
Результирующая локаль объединяет оба изменения.
Важно различать:
dayjs.locale('ru'))updateLocale)Изменение через updateLocale влияет на локаль независимо
от того, используется ли она в данный момент.
dayjs.locale('ru')
dayjs.updateLocale('ru', {
months: ['Янв', 'Фев']
})
После переключения изменения будут применяться автоматически.
Для анализа текущей локали применяется плагин
localeData.
import localeData from 'dayjs/plugin/localeData'
dayjs.extend(localeData)
Позволяет получить:
dayjs.months()
dayjs.weekdays()
dayjs.weekdaysMin()
dayjs.weekdaysShort()
dayjs.localeData().firstDayOfWeek()
Это полезно для проверки результатов updateLocale.
Иногда требуется полная кастомизация без создания новой локали.
dayjs.updateLocale('en', {
months: [
'Month1', 'Month2', 'Month3', 'Month4',
'Month5', 'Month6', 'Month7', 'Month8',
'Month9', 'Month10', 'Month11', 'Month12'
],
weekdays: [
'SunX', 'MonX', 'TueX', 'WedX',
'ThuX', 'FriX', 'SatX'
],
longDateFormat: {
L: 'DD.MM.YYYY',
LL: 'D MMM YYYY',
LLL: 'D MMM YYYY HH:mm'
},
relativeTime: {
future: '+%s',
past: '-%s',
s: '<1m',
m: '1m',
mm: '%dm',
h: '1h',
hh: '%dh',
d: '1d',
dd: '%dd',
M: '1mo',
MM: '%dmo',
y: '1y',
yy: '%dy'
}
})
Такая конфигурация фактически превращает локаль в доменно-специфичный формат отображения.
При модификации массивов важно учитывать, что Day.js не объединяет массивы, а полностью заменяет их.
Это означает:
Если локаль не зарегистрирована, updateLocale может не
создать её автоматически. В таком случае необходимо сначала
импортировать или определить локаль:
import 'dayjs/locale/ru'
После этого можно безопасно применять модификации.
Day.js хранит локали в памяти. Повторные вызовы
updateLocale:
Это делает механизм быстрым, но требует аккуратности в динамических приложениях, где локали могут изменяться в рантайме.
relativeTime без всех ключейupdateLocale в разных модулях
приложенияКаждая из этих ситуаций приводит к непредсказуемому выводу дат при форматировании.