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

Модель конфигурации в Day.js строится на сочетании глобальных настроек, локальных параметров экземпляра и подключаемых плагинов. Библиотека изначально проектируется как неизменяемая (immutable), поэтому любое «переопределение» не изменяет исходные объекты, а формирует новые состояния через цепочку преобразований.

Ключевые уровни управления поведением:

  • глобальная локаль и настройки форматирования;
  • локаль конкретного экземпляра;
  • расширения через плагины;
  • переопределение параметров локалей;
  • функциональные обёртки над API.

Такое разделение позволяет контролировать форматирование, парсинг и интерпретацию дат без изменения ядра библиотеки.


Глобальная локализация и её переопределение

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

Подключение и установка глобальной локали:

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

dayjs.locale('ru')

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

Переопределение глобальной локали возможно в любой момент выполнения программы:

dayjs.locale('en')
dayjs.locale('de')

Каждое последующее изменение влияет на все новые вычисления, если не задан локальный контекст на уровне экземпляра.


Переопределение параметров локали через updateLocale

Механизм updateLocale позволяет изменять отдельные части существующей локали без полной замены.

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

dayjs.locale('ru')

dayjs.updateLocale('ru', {
  months: [
    'Янв', 'Фев', 'Мар', 'Апр', 'Май', 'Июн',
    'Июл', 'Авг', 'Сен', 'Окт', 'Ноя', 'Дек'
  ]
})

Изменение затрагивает только указанные поля, остальные настройки локали сохраняются.

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

Особенно часто изменяется блок relativeTime, отвечающий за выражения вида «через 5 минут» или «2 дня назад».

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

Такая переопределяемая структура позволяет адаптировать текст под доменные требования приложения.


Локальные настройки экземпляра

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

const d1 = dayjs().locale('en')
const d2 = dayjs().locale('ru')

Приоритет локали:

  1. локаль экземпляра;
  2. глобальная локаль dayjs.locale();
  3. локаль по умолчанию библиотеки.

Подобная иерархия позволяет создавать изолированные контексты форматирования, например для мультиязычных интерфейсов.


Механизм плагинов как способ переопределения поведения

Day.js использует архитектуру расширений через extend, которая фактически изменяет поведение ядра.

import dayjs from 'dayjs'
import utc from 'dayjs/plugin/utc'

dayjs.extend(utc)

После подключения плагина появляются новые методы и изменяется логика обработки даты.

Плагины как слой модификации

Каждый плагин:

  • добавляет новые методы;
  • переопределяет существующие вычисления;
  • расширяет форматирование или парсинг.

Пример цепочки расширений:

import timezone from 'dayjs/plugin/timezone'
import utc from 'dayjs/plugin/utc'

dayjs.extend(utc)
dayjs.extend(timezone)

Порядок подключения влияет на итоговое поведение, так как некоторые плагины зависят от других.


Переопределение парсинга и форматов

Базовый Day.js ограничен строгим ISO-парсингом, однако плагин customParseFormat меняет это поведение.

import customParseFormat from 'dayjs/plugin/customParseFormat'

dayjs.extend(customParseFormat)

После подключения становится доступным переопределение правил разбора строк:

dayjs('12-05-2026', 'DD-MM-YYYY')

Такое поведение фактически заменяет стандартный парсер на пользовательский.

Переопределение форматирования

Через плагин advancedFormat расширяется набор токенов форматирования:

import advancedFormat from 'dayjs/plugin/advancedFormat'

dayjs.extend(advancedFormat)

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


Переопределение временной зоны через UTC и Timezone

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

import utc from 'dayjs/plugin/utc'
import timezone from 'dayjs/plugin/timezone'

dayjs.extend(utc)
dayjs.extend(timezone)

Перевод в UTC как смена контекста

dayjs().utc()

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

Привязка к зоне

dayjs().tz('Europe/Moscow')

Зона задаёт новый слой интерпретации, изменяя отображение без изменения внутреннего timestamp.


Переопределение локальных настроек календаря

Плагин calendar позволяет изменять текстовые шаблоны отображения дат относительно текущего момента.

dayjs.updateLocale('ru', {
  calendar: {
    sameDay: '[Сегодня в] HH:mm',
    nextDay: '[Завтра в] HH:mm',
    nextWeek: 'dddd [в] HH:mm',
    lastDay: '[Вчера в] HH:mm',
    lastWeek: '[Прошлое] dddd [в] HH:mm',
    sameElse: 'DD.MM.YYYY'
  }
})

Эта конфигурация переопределяет стандартные правила вывода контекста времени, формируя полностью кастомизированное поведение.


Приоритеты конфигурации и конфликтующие настройки

При одновременном использовании нескольких уровней переопределения действует строгая иерархия:

  • экземплярные настройки перекрывают глобальные;
  • updateLocale изменяет базовую локаль, но не заменяет экземплярные вызовы;
  • плагины могут изменять поведение методов независимо от локали;
  • порядок подключения плагинов влияет на итоговую реализацию методов.

Пример конфликтной ситуации:

dayjs.locale('en')

const d = dayjs().locale('ru').utc()

Здесь одновременно присутствуют три слоя:

  • глобальная локаль (en);
  • локаль экземпляра (ru);
  • преобразование временной зоны (utc).

Итоговое поведение формируется на основе комбинации этих уровней, где методы временной зоны и форматирования могут перекрывать языковые настройки.


Переопределение через обёртки и композицию

Помимо встроенных механизмов, поведение Day.js часто изменяется через функциональные обёртки, не затрагивающие исходную библиотеку.

const formatDate = (date) =>
  dayjs(date).utc().locale('ru').format('DD.MM.YYYY HH:mm')

Такая композиция формирует предопределённый пайп обработки, где каждый вызов фиксирует конкретные правила интерпретации.


Изоляция конфигураций в сложных системах

В крупных приложениях конфигурация часто разделяется на модули:

  • отдельный модуль локалей;
  • модуль временных зон;
  • модуль форматов отображения;
  • слой доменной логики дат.

Каждый модуль может переопределять поведение Day.js независимо, формируя независимые контексты работы с датами без глобального вмешательства.