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

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

Создание объекта даты выполняется через передачу обычного JavaScript-объекта в функцию moment():

moment({
    year: 2025,
    month: 4,
    day: 15
});

Каждое свойство объекта соответствует определённой части даты или времени.


Основные свойства объекта

Moment.js поддерживает следующие поля:

Свойство Описание
year Год
month Месяц
date День месяца
day День недели
hour Часы
minute Минуты
second Секунды
millisecond Миллисекунды

Пример полной даты:

const date = moment({
    year: 2025,
    month: 6,
    date: 20,
    hour: 14,
    minute: 35,
    second: 10
});

console.log(date.format("YYYY-MM-DD HH:mm:ss"));

Результат:

2025-07-20 14:35:10

Особенность поля month

Поле month использует нумерацию с нуля:

Значение Месяц
0 Январь
1 Февраль
2 Март
11 Декабрь

Пример:

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

Создаёт:

2025-01-01

Это поведение полностью повторяет стандартный объект Date в JavaScript.


Использование date и day

Важно различать свойства date и day.

date — день месяца

moment({
    year: 2025,
    month: 4,
    date: 10
});

Создаётся:

10 мая 2025

day — день недели

moment({
    year: 2025,
    month: 4,
    day: 1
});

Значение 1 означает понедельник.

При использовании day Moment.js вычисляет ближайший соответствующий день недели относительно текущей недели.


Создание только времени

Если указать только время, отсутствующие части даты будут взяты из текущего момента.

const time = moment({
    hour: 18,
    minute: 45
});

console.log(time.format("YYYY-MM-DD HH:mm"));

Если текущая дата:

2026-05-21

Результат:

2026-05-21 18:45

Частичное заполнение объекта

Moment.js позволяет указывать только необходимые поля.

Только год

moment({
    year: 2030
});

Результат:

2030-01-01 00:00:00

Год и месяц

moment({
    year: 2030,
    month: 9
});

Результат:

2030-10-01 00:00:00

Автоматическая нормализация значений

Moment.js автоматически корректирует выход значений за допустимые пределы.

Превышение количества месяцев

moment({
    year: 2025,
    month: 14
});

Результат:

2026-03-01

Превышение количества дней

moment({
    year: 2025,
    month: 0,
    date: 40
});

Результат:

2025-02-09

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


Создание объекта с миллисекундами

const date = moment({
    year: 2025,
    month: 3,
    date: 5,
    hour: 12,
    minute: 10,
    second: 15,
    millisecond: 250
});

console.log(date.format("HH:mm:ss.SSS"));

Результат:

12:10:15.250

Использование сокращённых имён свойств

Moment.js поддерживает короткие варианты названий:

Полное имя Сокращение
year y
month M
date d
hour h
minute m
second s
millisecond ms

Пример:

moment({
    y: 2025,
    M: 7,
    d: 12,
    h: 16,
    m: 20
});

Работа с объектами из API

Часто сервер возвращает дату в виде набора полей:

const response = {
    year: 2025,
    month: 10,
    date: 8,
    hour: 9,
    minute: 15
};

Moment.js позволяет напрямую преобразовать такой объект:

const date = moment(response);

console.log(date.format("YYYY-MM-DD HH:mm"));

Динамическое создание даты

Создание из объекта удобно при программной генерации параметров.

const currentYear = 2025;
const currentMonth = 6;

const date = moment({
    year: currentYear,
    month: currentMonth,
    date: 1
});

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

Пример обработки данных HTML-формы:

const formData = {
    year: Number(yearInput.value),
    month: Number(monthInput.value),
    date: Number(dayInput.value)
};

const birthday = moment(formData);

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


Создание даты и времени по отдельным переменным

const year = 2025;
const month = 11;
const date = 24;
const hour = 23;
const minute = 59;

const newYearEve = moment({
    year,
    month,
    date,
    hour,
    minute
});

Проверка корректности объекта даты

После создания даты рекомендуется проверять её валидность.

const invalidDate = moment({
    year: 2025,
    month: 1,
    date: 31
});

console.log(invalidDate.isValid());

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


Сравнение с созданием из массива

Moment.js поддерживает два похожих подхода:

Из массива

moment([2025, 4, 10, 12, 30]);

Из объекта

moment({
    year: 2025,
    month: 4,
    date: 10,
    hour: 12,
    minute: 30
});

Создание из объекта считается более читаемым и менее подверженным ошибкам, особенно при большом количестве параметров.


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

Для создания даты в UTC используется moment.utc():

const utcDate = moment.utc({
    year: 2025,
    month: 3,
    date: 18,
    hour: 10
});

console.log(utcDate.format());

Комбинирование с методами изменения даты

После создания объект Moment можно изменять стандартными методами.

const date = moment({
    year: 2025,
    month: 0,
    date: 1
});

date
    .add(10, "days")
    .subtract(2, "hours");

console.log(date.format());

Создание сложных дат через вычисления

const fiscalYearStart = moment({
    year: 2025,
    month: 3,
    date: 1
}).startOf("day");

Внутренний принцип работы

При передаче объекта Moment.js:

  1. Извлекает поля даты и времени.
  2. Приводит значения к числам.
  3. Заполняет отсутствующие части значениями по умолчанию.
  4. Выполняет нормализацию диапазонов.
  5. Создаёт внутренний объект Date.

Упрощённая схема:

moment({
    year: 2025,
    month: 15,
    date: 40
});

Преобразуется примерно в:

new Date(2025, 15, 40)

После чего JavaScript автоматически корректирует дату.


Практический пример: генерация расписания

function createMeeting(year, month, date, hour, minute) {
    return moment({
        year,
        month,
        date,
        hour,
        minute
    });
}

const meeting = createMeeting(2025, 8, 15, 14, 30);

console.log(
    meeting.format("DD.MM.YYYY HH:mm")
);

Практический пример: дедлайн задачи

const task = {
    year: 2025,
    month: 5,
    date: 20,
    hour: 23,
    minute: 59
};

const deadline = moment(task);

console.log(deadline.fromNow());

Преимущества создания из объекта

Повышенная читаемость

moment({
    year: 2025,
    month: 11,
    date: 31
});

Сразу понятно, какое значение чему соответствует.

Удобство работы с данными

Объекты легко:

  • сериализуются;
  • передаются по API;
  • формируются динамически;
  • валидируются;
  • модифицируются.

Меньше ошибок

В массивах легко перепутать порядок:

moment([2025, 11, 31]);

В объекте ошибка менее вероятна:

moment({
    year: 2025,
    month: 11,
    date: 31
});

Ограничения подхода

Нулевая индексация месяцев

Наиболее частый источник ошибок:

month: 0

означает январь.

Возможная неоднозначность day

day: 5

— это пятница, а не пятый день месяца.

Для дня месяца следует использовать date.

Автоматическая нормализация

Иногда нежелательна:

moment({
    year: 2025,
    month: 1,
    date: 31
});

может привести к неожиданному результату вместо ошибки.