Создание дат из объектов

Одним из способов инициализации даты в Day.js является передача объекта с календарными компонентами. Такой подход используется для явного задания всех частей даты без разбора строкового представления или использования timestamp.

import dayjs from 'dayjs';

const date = dayjs({
  year: 2024,
  month: 0,
  day: 15,
  hour: 10,
  minute: 30,
  second: 45
});

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


Структура объекта и поддерживаемые поля

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

  • year — полный год (например, 2024)
  • month — месяц, начиная с 0 (0 — январь, 11 — декабрь)
  • day — день месяца
  • hour — часы (0–23)
  • minute — минуты (0–59)
  • second — секунды (0–59)
  • millisecond — миллисекунды (0–999)
const date = dayjs({
  year: 2025,
  month: 11,
  day: 31,
  hour: 23,
  minute: 59,
  second: 59,
  millisecond: 999
});

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


Нормализация значений

Day.js выполняет автоматическую нормализацию выходящих за пределы значений. При переполнении компонентов происходит перенос в старшие единицы времени.

const date = dayjs({
  year: 2024,
  month: 0,
  day: 40
});

В данном случае 40-й день января преобразуется в корректную календарную дату с переходом в февраль.

Аналогично обрабатываются:

  • превышение количества дней в месяце
  • выход за границы часов, минут и секунд
  • отрицательные значения компонентов

Частично заданные объекты

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

const date = dayjs({
  year: 2023,
  month: 6,
  day: 10
});

В таком случае время устанавливается в 00:00:00.000.

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

  • дни рождения
  • расписания
  • события по дням

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

При передаче некорректных значений объектная инициализация не всегда приводит к ошибке. Вместо этого создаётся некорректная дата (Invalid Date).

const date = dayjs({
  year: 'не число',
  month: null,
  day: undefined
});

Результат такой операции не является валидной датой и требует проверки через механизм:

date.isValid()

Порядок обработки компонентов

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

Особенности обработки:

  • год задаёт базовую точку календаря
  • месяц добавляется после установки года
  • день влияет на итоговую нормализацию месяца
  • время применяется после календарной части

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

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

const rawData = [
  { year: 2024, month: 0, day: 1 },
  { year: 2024, month: 0, day: 2 },
  { year: 2024, month: 0, day: 3 }
];

const dates = rawData.map(item => dayjs(item));

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


Взаимодействие с временными зонами и плагинами

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

Например, при подключении UTC-плагина:

import utc from 'dayjs/plugin/utc';
dayjs.extend(utc);

const date = dayjs.utc({
  year: 2024,
  month: 5,
  day: 20
});

В этом случае объект интерпретируется в контексте UTC, а не локального времени среды выполнения.


Особенности интерпретации отсутствующих значений времени

При частичном определении временных компонентов поведение остаётся детерминированным:

  • отсутствующие часы → 00
  • отсутствующие минуты → 00
  • отсутствующие секунды → 00
  • отсутствующие миллисекунды → 000
const date = dayjs({
  year: 2024,
  month: 8,
  day: 5,
  hour: 14
});

Результирующее время фиксируется как 14:00:00.000.


Сравнение с другими способами создания даты

Объектная инициализация отличается от строковой и числовой:

  • строка требует разбора формата
  • timestamp зависит от миллисекундной точности
  • объект обеспечивает структурированное задание компонентов
dayjs('2024-01-01');
dayjs(1704067200000);
dayjs({ year: 2024, month: 0, day: 1 });

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