В библиотеке Day.js работа с датами часто строится вокруг промежуточного внутреннего представления объекта, которое позволяет разложить момент времени на набор атомарных компонентов. Одним из ключевых механизмов является преобразование экземпляра Day.js в обычный объект JavaScript, содержащий числовые поля даты и времени.
Экземпляр Day.js инкапсулирует временную метку, но при необходимости может быть преобразован в структурированный объект. Такое преобразование полезно при сериализации данных, взаимодействии с API, формировании DTO, а также при работе с формами, где требуется явное разбиение даты на компоненты.
Метод toObject() возвращает объект, содержащий
стандартные поля времени:
yearsmonthsdatehoursminutessecondsmillisecondsКаждое поле соответствует конкретной части временной метки и извлекается из внутреннего состояния объекта 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 отсутствует метод,
аналогичный 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, такую как форматирование, плагины или цепочки вызовов. Результат представляет собой чистую структуру данных без поведенческого слоя библиотеки.