Структура результатов

Каждый экземпляр Day.js представляет собой обёртку над стандартным объектом Date, дополненную слоем неизменяемой (immutable) функциональности и набором методов для преобразования и форматирования времени. Несмотря на внешнюю простоту API, структура результата имеет несколько внутренних уровней, которые определяют поведение библиотеки.

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

Ключевые внутренние компоненты:

  • $d — нативный объект Date, содержащий фактическое значение времени
  • $L — локаль, используемая для форматирования (например, en, ru)
  • $u — флаг UTC-режима
  • $x — расширенные пользовательские данные (используются плагинами)
  • $M / $y / $D / $H / $m / $s / $ms — кешированные компоненты даты

Именно $d является источником истины: все вычисления в конечном счёте транслируются в методы стандартного Date.


Формат результата экземпляра

Экземпляр Day.js не является «плоским» объектом данных. При логировании или сериализации он ведёт себя специфическим образом.

При выводе в консоль отображается объект, содержащий внутренние поля, однако при преобразовании в примитивы используется значение $d.

Приведение к строке

Метод toString() возвращает строковое представление, основанное на локали окружения:

  • используется формат Date.prototype.toString()
  • результат зависит от системных настроек времени

Приведение к числу

Метод valueOf() возвращает числовое представление времени:

  • эквивалент Date.now() для конкретного экземпляра
  • фактически возвращается this.$d.valueOf()

Это поведение позволяет использовать Day.js в арифметике дат:

  • сравнение через >, <
  • разность дат через вычитание

Структура возвращаемых значений методов

Методы Day.js делятся на две большие категории по типу результата: методы, возвращающие новый экземпляр, и методы, возвращающие примитив.


Методы, возвращающие экземпляр Day.js

Большинство операций модификации времени не изменяют текущий объект, а создают новый экземпляр с изменёнными внутренними полями.

Примеры:

  • add()
  • subtract()
  • set()
  • startOf()
  • endOf()
  • locale()
  • utc()

Структура результата

Возвращаемый объект имеет ту же внутреннюю форму:

  • новый $d (новый Date)
  • скопированные $L, $u
  • пересчитанные кеш-поля

Принцип неизменяемости означает:

  • исходный объект сохраняется
  • каждый вызов создаёт новый слой состояния

Это формирует цепочечную модель:

Dayjs → Dayjs → Dayjs → ...

где каждый шаг — новый независимый объект.


Методы, возвращающие примитивные значения

Некоторые методы предназначены для извлечения конкретных данных из экземпляра.

Числовые значения

  • year()
  • month()
  • date()
  • hour()
  • minute()
  • second()

Структура результата:

  • возвращается число
  • данные берутся из кешированных полей или напрямую из $d

Форматированные строки

  • format()
  • toISOString()
  • toJSON()

format()

Метод format() возвращает строку, построенную на основе токенов:

  • результат всегда string
  • объект Day.js не изменяется
  • используется локаль $L

Структура результата зависит от шаблона:

  • YYYY — год
  • MM — месяц
  • DD — день
  • HH:mm:ss — время

Пример структуры выхода:

"2026-05-23 14:30:00"

JSON-представление

Метод toJSON() делегирует вызов toISOString():

  • результат стандартизирован по ISO-8601
  • всегда UTC
  • всегда строка

Пример структуры:

"2026-05-23T12:30:00.000Z"

Структура при сериализации

При использовании JSON.stringify() объект Day.js автоматически преобразуется через toJSON().

Таким образом, итоговая структура в JSON:

  • строка ISO-формата
  • без внутренних полей $d, $L, $u

Пример:

"2026-05-23T12:30:00.000Z"

Важно, что внутренняя структура полностью скрывается, и Day.js ведёт себя как примитивный тип.


Клонирование и структура копий

Метод clone() создаёт новый экземпляр с идентичным состоянием.

Структурно копия содержит:

  • новый объект-обёртку
  • новый $d с тем же временем
  • копии внутренних флагов

При этом отсутствует разделение ссылок на изменяемые данные:

  • изменение одного экземпляра не влияет на другой
  • каждый объект изолирован

Валидность результата

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

Метод isValid() проверяет:

  • корректность $d
  • соответствие диапазонам даты
  • результат парсинга строки

Структура результата метода:

  • true — дата корректна
  • false — дата невалидна

Никаких исключений или дополнительных структур не возвращается.


Структура при использовании плагинов

Day.js расширяется через плагины, которые модифицируют:

  • прототип экземпляра
  • внутренние поля $x

Расширенные данные $x

Поле $x служит контейнером:

  • пользовательских значений
  • промежуточных вычислений
  • данных плагинов (timezone, relativeTime и др.)

Структура $x не стандартизирована:

  • зависит от подключённых расширений
  • может содержать вложенные объекты
  • не участвует напрямую в форматировании

Структура временных вычислений

При операциях add и subtract происходит пересборка $d.

Механизм:

  1. берётся текущий $d
  2. выполняется вычисление смещения
  3. создаётся новый Date
  4. формируется новый экземпляр Day.js

Структура результата всегда включает:

  • новый временной штамп
  • обновлённые кеш-поля
  • сохранённые флаги локали и UTC

Поведение при сравнении объектов

Экземпляры Day.js при сравнении не сравниваются как объекты:

  • dayjsA === dayjsB — сравнение ссылок
  • dayjsA.valueOf() === dayjsB.valueOf() — сравнение времени

Структура результата valueOf() делает возможным корректное сравнение через:

  • числовое представление времени
  • миллисекунды с начала эпохи Unix

Итоговая модель результата

Структурно любой экземпляр Day.js можно представить как многослойный объект:

  • внешний API-слой (методы форматирования и вычислений)
  • слой состояния (локаль, UTC, плагины)
  • слой кеша компонентов даты
  • базовый Date объект

Именно сочетание этих слоёв формирует поведение всех возвращаемых значений библиотеки, где каждый метод либо извлекает данные из структуры, либо создаёт её новую версию без нарушения неизменяемости.