В 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
})
В этом случае:
0100:00:00.000Это поведение делает объектный формат удобным для генерации дат начала периодов (годов, месяцев, дней).
Объектный формат поддерживает одновременную установку даты и времени:
dayjs({
year: 2021,
month: 5,
date: 10,
hour: 14,
minute: 45,
second: 30
})
Такая запись эквивалентна точной временной метке без необходимости
цепочки вызовов 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
})
Такой подход исключает неоднозначность парсинга строк и снижает зависимость от локальных форматов.
Объектный формат 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
})
}
Такой подход снижает количество преобразований и минимизирует вероятность ошибок при работе с календарными значениями.