Преобразование в объект

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

Экземпляр Day.js инкапсулирует временную метку, но при необходимости может быть преобразован в структурированный объект. Такое преобразование полезно при сериализации данных, взаимодействии с API, формировании DTO, а также при работе с формами, где требуется явное разбиение даты на компоненты.

Метод toObject() возвращает объект, содержащий стандартные поля времени:

  • years
  • months
  • date
  • hours
  • minutes
  • seconds
  • milliseconds

Каждое поле соответствует конкретной части временной метки и извлекается из внутреннего состояния объекта Day.js.

import dayjs from 'dayjs';

const d = dayjs('2026-05-23T14:35:10.500');

const obj = d.toObject();

console.log(obj);

Результат:

{
  years: 2026,
  months: 4,
  date: 23,
  hours: 14,
  minutes: 35,
  seconds: 10,
  milliseconds: 500
}

Особенность нумерации месяцев

Важная деталь заключается в том, что поле months возвращается в диапазоне от 0 до 11. Это соответствует внутреннему представлению дат в JavaScript, где январь имеет индекс 0, а декабрь — 11. Такое поведение необходимо учитывать при преобразовании объекта в внешние форматы.

const d = dayjs('2026-01-15');

console.log(d.toObject().months); // 0

Использование в сериализации

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

const payload = {
  createdAt: dayjs().toObject()
};

Такой подход упрощает дальнейшую обработку на стороне API, так как исключает необходимость дополнительного парсинга строки даты.

Преобразование в пользовательские структуры

Результат toObject() может использоваться как базовый слой для построения собственных структур. Например, можно формировать объект с изменённой семантикой полей:

const d = dayjs();

const normalized = {
  year: d.year(),
  month: d.month() + 1,
  day: d.date(),
  time: {
    h: d.hour(),
    m: d.minute(),
    s: d.second()
  }
};

Хотя toObject() предоставляет готовую структуру, ручное построение объекта позволяет контролировать формат и устранить особенности, такие как нулевая индексация месяцев.

Отличие от Date.prototype

В стандартном объекте Date отсутствует метод, аналогичный toObject(). Для получения подобной структуры приходится вручную вызывать методы:

  • getFullYear()
  • getMonth()
  • getDate()
  • getHours()
  • getMinutes()
  • getSeconds()
  • getMilliseconds()

Day.js унифицирует этот процесс, предоставляя единый метод, который возвращает сразу полный набор значений.

const native = new Date();

const legacyObj = {
  years: native.getFullYear(),
  months: native.getMonth(),
  date: native.getDate(),
  hours: native.getHours(),
  minutes: native.getMinutes(),
  seconds: native.getSeconds(),
  milliseconds: native.getMilliseconds()
};

Внутренние особенности формирования объекта

При вызове toObject() Day.js извлекает данные из своей внутренней структуры, основанной на Unix timestamp. Преобразование учитывает локальное время, если не используется UTC-плагин. Это означает, что итоговый объект отражает локальную временную зону окружения выполнения.

При подключении UTC-плагина поведение изменяется: значения становятся согласованными с универсальным координированным временем, что влияет на итоговые поля объекта.

Практика нормализации данных

При работе с API и базами данных часто требуется унифицировать формат даты. Преобразование в объект используется как промежуточный этап перед сохранением или сравнением:

function normalizeDate(input) {
  return dayjs(input).toObject();
}

const record = {
  start: normalizeDate('2026-05-01'),
  end: normalizeDate('2026-05-23')
};

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

Поведение при некорректных данных

Если входная строка не может быть распознана как дата, Day.js возвращает объект с признаком невалидности. При этом toObject() может вернуть некорректные или нулевые значения, если не выполнена проверка валидности через isValid().

const d = dayjs('invalid date');

if (d.isValid()) {
  console.log(d.toObject());
}

Использование в сравнении и вычислениях

Объектное представление может использоваться для частичных сравнений дат, например, при проверке совпадения только дня и месяца без учёта времени:

const a = dayjs('2026-05-23T10:00:00').toObject();
const b = dayjs('2026-05-23T18:00:00').toObject();

const sameDay = a.date === b.date && a.months === b.months && a.years === b.years;

Такой подход полезен в сценариях календарной логики, где время суток не имеет значения.

Ограничения объектного представления

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