Создание из массива значений

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

Массив передаётся в функцию moment() и интерпретируется как набор временных компонентов:

moment([год, месяц, день, часы, минуты, секунды, миллисекунды])

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


Базовый синтаксис

Простейший пример:

const date = moment([2025, 4, 10]);

console.log(date.format('YYYY-MM-DD'));

Результат:

2025-05-10

Порядок значений в массиве

Moment.js использует строго определённый порядок элементов:

Индекс Значение
0 Год
1 Месяц
2 День месяца
3 Часы
4 Минуты
5 Секунды
6 Миллисекунды

Пример с полным набором параметров:

const date = moment([2025, 0, 15, 14, 30, 45, 120]);

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

Результат:

2025-01-15 14:30:45.120

Особенность месяцев

Наиболее важная особенность — месяцы нумеруются с нуля.

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

Пример:

moment([2025, 0, 1])  // Январь
moment([2025, 11, 1]) // Декабрь

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


Создание только из года

Если указать только год:

const date = moment([2025]);

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

Результат:

2025-01-01 00:00:00

Отсутствующие значения автоматически заполняются минимально возможными.


Создание из года и месяца

const date = moment([2025, 6]);

console.log(date.format('YYYY-MM-DD'));

Результат:

2025-07-01

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

const date = moment([2025, 8, 20, 18, 45]);

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

Результат:

2025-09-20 18:45

Работа с миллисекундами

Moment.js позволяет задавать миллисекунды напрямую:

const date = moment([2025, 3, 12, 10, 20, 30, 500]);

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

Результат:

10:20:30.500

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

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

Переполнение месяцев

const date = moment([2025, 14, 1]);

console.log(date.format('YYYY-MM-DD'));

Результат:

2026-03-01

Месяц 14 автоматически преобразуется в март следующего года.


Переполнение дней

const date = moment([2025, 0, 40]);

console.log(date.format('YYYY-MM-DD'));

Результат:

2025-02-09

Отрицательные значения

const date = moment([2025, -1, 1]);

console.log(date.format('YYYY-MM-DD'));

Результат:

2024-12-01

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

Некоторые комбинации могут создавать невалидные даты.

Проверка выполняется методом isValid():

const date = moment([2025, 1, 30]);

console.log(date.isValid());

Результат:

false

Поскольку 30 февраля не существует.


Использование strict-режима

При работе с массивами strict-режим напрямую не применяется так, как при строковом парсинге. Однако корректность данных всё равно можно проверять через isValid().

const date = moment([2025, 1, 29]);

console.log(date.isValid());

Результат:

false

2025 год не является високосным.


Получение компонентов даты

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

const date = moment([2025, 4, 10, 15, 20]);

console.log(date.year());
console.log(date.month());
console.log(date.date());
console.log(date.hour());
console.log(date.minute());

Результат:

2025
4
10
15
20

Создание текущей даты через массив

Массив может формироваться динамически:

const now = new Date();

const date = moment([
    now.getFullYear(),
    now.getMonth(),
    now.getDate()
]);

console.log(date.format('YYYY-MM-DD'));

Формирование массива вручную

Компоненты могут храниться отдельно:

const year = 2025;
const month = 7;
const day = 22;

const date = moment([year, month, day]);

console.log(date.format('YYYY-MM-DD'));

Генерация дат в цикле

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

for (let day = 1; day <= 5; day++) {
    const date = moment([2025, 0, day]);

    console.log(date.format('YYYY-MM-DD'));
}

Результат:

2025-01-01
2025-01-02
2025-01-03
2025-01-04
2025-01-05

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

Часто день, месяц и год приходят из отдельных полей формы.

const day = 15;
const month = 3;
const year = 2025;

const date = moment([year, month, day]);

console.log(date.format('DD.MM.YYYY'));

Результат:

15.04.2025

Создание времени без даты

Moment.js всегда требует год, однако можно использовать текущую дату:

const current = moment();

const date = moment([
    current.year(),
    current.month(),
    current.date(),
    12,
    30
]);

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

Создание UTC-даты из массива

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

const date = moment.utc([2025, 0, 1, 12, 0]);

console.log(date.format());

Результат:

2025-01-01T12:00:00Z

Сравнение local и UTC

Local time

const localDate = moment([2025, 0, 1, 12]);

UTC time

const utcDate = moment.utc([2025, 0, 1, 12]);

UTC-дата не зависит от локального часового пояса.


Создание даты с timezone

При использовании moment-timezone:

const date = moment.tz(
    [2025, 5, 10, 14, 0],
    'Europe/Moscow'
);

console.log(date.format());

Преобразование массива в объект Date

const momentDate = moment([2025, 0, 1]);

const jsDate = momentDate.toDate();

console.log(jsDate);

Создание копии даты

const original = moment([2025, 3, 10]);

const copy = moment(original);

copy.add(5, 'days');

console.log(original.format('YYYY-MM-DD'));
console.log(copy.format('YYYY-MM-DD'));

Результат:

2025-04-10
2025-04-15

Работа с високосными годами

const leap = moment([2024, 1, 29]);

console.log(leap.isValid());

Результат:

true

Проверка переполнения

Moment.js предоставляет информацию о причине невалидности:

const date = moment([2025, 1, 30]);

console.log(date.parsingFlags());

Результат содержит диагностическую информацию:

{
    overflow: 2
}

Использование Array.map()

const days = [1, 5, 10, 15];

const dates = days.map(day =>
    moment([2025, 0, day]).format('YYYY-MM-DD')
);

console.log(dates);

Результат:

[
    '2025-01-01',
    '2025-01-05',
    '2025-01-10',
    '2025-01-15'
]

Создание расписаний

const lessons = [
    [2025, 8, 1, 9, 0],
    [2025, 8, 3, 9, 0],
    [2025, 8, 5, 9, 0]
];

const schedule = lessons.map(item => moment(item));

schedule.forEach(date => {
    console.log(date.format('YYYY-MM-DD HH:mm'));
});

Мутация после создания

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

const date = moment([2025, 0, 1]);

date
    .add(1, 'month')
    .subtract(5, 'days')
    .set('hour', 10);

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

Сравнение дат, созданных из массивов

const first = moment([2025, 0, 1]);
const second = moment([2025, 5, 1]);

console.log(first.isBefore(second));
console.log(second.isAfter(first));

Результат:

true
true

Использование diff()

const start = moment([2025, 0, 1]);
const end = moment([2025, 0, 10]);

console.log(end.diff(start, 'days'));

Результат:

9

Типичные ошибки

Ошибка с месяцами

Неправильно:

moment([2025, 5, 1]) // Ожидался май

Фактически создаётся июнь.

Правильно:

moment([2025, 4, 1])

Передача строки вместо числа

Неправильно:

moment(['2025', '0', '1'])

Правильно:

moment([2025, 0, 1])

Перепутанный порядок параметров

Неправильно:

moment([10, 5, 2025])

Правильно:

moment([2025, 5, 10])

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

const dates = [];

for (let i = 1; i <= 31; i++) {
    dates.push(
        moment([2025, 0, i]).format('YYYY-MM-DD')
    );
}

console.log(dates);

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

const times = [];

for (let hour = 9; hour <= 18; hour++) {
    times.push(
        moment([2025, 0, 1, hour, 0]).format('HH:mm')
    );
}

console.log(times);

Результат:

[
    '09:00',
    '10:00',
    '11:00',
    '12:00',
    '13:00',
    '14:00',
    '15:00',
    '16:00',
    '17:00',
    '18:00'
]