Установка значений через объекты

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

Основная идея заключается в том, что вместо строки или timestamp в конструктор передаётся структура вида:

dayjs({
  year: 2024,
  month: 0,
  day: 15,
  hour: 10,
  minute: 30,
  second: 0,
  millisecond: 0
})

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


Активация поддержки объектного формата

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

import dayjs from 'dayjs'
import objectSupport from 'dayjs/plugin/objectSupport'

dayjs.extend(objectSupport)

После подключения становится доступна интерпретация объектов в конструкторе dayjs().


Поля объекта и их смысл

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

  • year — полный год
  • month — месяц, начиная с 0 (январь = 0)
  • date или day — день месяца
  • hour — часы (0–23)
  • minute — минуты
  • second — секунды
  • millisecond — миллисекунды

Пример базовой даты:

dayjs({
  year: 2023,
  month: 11,
  date: 31
})

Такой вызов создаёт дату 31 декабря 2023 года.


Особенности индексации месяца

Ключевая деталь объектного формата — нумерация месяцев начинается с нуля. Это поведение совпадает с нативным Date в Jav * aScript:

dayjs({
  year: 2025,
  month: 0,
  date: 1
})

Результат соответствует 1 января 2025 года.

Ошибка в интерпретации месяцев — одна из наиболее частых причин некорректных дат при работе с объектами.


Частичные объекты и поведение значений по умолчанию

Объект может содержать только часть полей. Отсутствующие компоненты заполняются стандартными значениями:

dayjs({
  year: 2022
})

В этом случае:

  • месяц устанавливается в 0
  • день устанавливается в 1
  • время — 00:00:00.000

Это поведение делает объектный формат удобным для генерации дат начала периодов (годов, месяцев, дней).


Комбинация календарных и временных полей

Объектный формат поддерживает одновременную установку даты и времени:

dayjs({
  year: 2021,
  month: 5,
  date: 10,
  hour: 14,
  minute: 45,
  second: 30
})

Такая запись эквивалентна точной временной метке без необходимости цепочки вызовов set.


Отличие от метода set

Существует альтернативный способ изменения компонентов даты:

dayjs().set('year', 2025).set('month', 3)

В сравнении с объектным форматом:

  • объектный формат применяется при создании новой даты
  • set() изменяет уже существующий экземпляр
  • объектный формат задаёт состояние целиком, а не по частям

При массовом определении значений объектный подход снижает количество вызовов и повышает читаемость:

dayjs({
  year: 2025,
  month: 6,
  date: 20,
  hour: 8,
  minute: 0
})

Интерпретация некорректных значений

При передаче выходящих за пределы диапазона значений Day.js нормализует дату аналогично нативному поведению Jav * aScript:

dayjs({
  year: 2024,
  month: 13,
  date: 40
})

Такой объект не вызывает ошибку, а преобразуется в корректную дату с переносом значений в следующий год и месяц.

Это поведение важно учитывать при динамическом формировании объектов, особенно при расчётах календарных смещений.


Использование объекта для фиксированных временных точек

Объектный формат часто применяется для задания фиксированных точек времени в логике приложения:

const startOfWorkDay = dayjs({
  year: 2026,
  month: 4,
  date: 23,
  hour: 9,
  minute: 0
})

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


Сравнение с нативным Date

Объектный формат Day.js концептуально близок к new Date(year, month, day, ...), но обладает большей читаемостью и интеграцией с API библиотеки:

new Date(2025, 0, 15, 10, 30)

dayjs({
  year: 2025,
  month: 0,
  date: 15,
  hour: 10,
  minute: 30
})

Второй вариант легче расширяется, особенно при наличии дополнительных временных параметров.


Смешанные сценарии использования

Объектный формат может сочетаться с последующими операциями Day.js:

dayjs({
  year: 2023,
  month: 8,
  date: 1
})
  .add(7, 'day')
  .set('hour', 12)

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


Влияние отсутствия плагина

Без подключения objectSupport попытка передать объект приводит к интерпретации как недопустимого входного значения или возврату текущего времени:

dayjs({
  year: 2020
})

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


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

Объектный формат можно рассматривать как декларативное описание состояния времени. Каждое поле выступает независимой переменной, что упрощает генерацию дат из бизнес-логики:

function createInvoiceDate(year, month, day) {
  return dayjs({
    year,
    month,
    date: day,
    hour: 0,
    minute: 0,
    second: 0
  })
}

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