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-режим напрямую не применяется так, как
при строковом парсинге. Однако корректность данных всё равно можно
проверять через 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 используется moment.utc():
const date = moment.utc([2025, 0, 1, 12, 0]);
console.log(date.format());
Результат:
2025-01-01T12:00:00Z
const localDate = moment([2025, 0, 1, 12]);
const utcDate = moment.utc([2025, 0, 1, 12]);
UTC-дата не зависит от локального часового пояса.
При использовании moment-timezone:
const date = moment.tz(
[2025, 5, 10, 14, 0],
'Europe/Moscow'
);
console.log(date.format());
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'
]