Объект Date — стандартный встроенный механизм JavaScript
для работы с датой и временем. Библиотека Moment.js умеет принимать
экземпляры Date напрямую, создавая на их основе объект
Moment с полным набором методов форматирования, сравнения и
вычислений.
Создание объекта Moment из Date выполняется через
передачу экземпляра Date в функцию
moment().
const date = new Date();
const momentDate = moment(date);
console.log(momentDate.format());
Moment получает:
После этого создаётся независимый объект Moment.
Наиболее распространённый сценарий — создание объекта
Date без аргументов.
const now = new Date();
const m = moment(now);
console.log(m.format('YYYY-MM-DD HH:mm:ss'));
Результат:
2026-05-21 14:30:45
const birthday = new Date(1995, 4, 15);
const m = moment(birthday);
console.log(m.format('DD.MM.YYYY'));
Результат:
15.05.1995
В JavaScript месяцы в Date начинаются с нуля:
| Значение | Месяц |
|---|---|
| 0 | Январь |
| 1 | Февраль |
| 2 | Март |
| … | … |
| 11 | Декабрь |
Поэтому:
new Date(2026, 0, 1)
означает:
1 января 2026
Иногда необходимо убедиться, что в Moment передаётся именно
Date.
const value = new Date();
console.log(value instanceof Date);
Результат:
true
DateMoment копирует значение даты, а не хранит ссылку на исходный объект.
const original = new Date();
const m = moment(original);
original.setFullYear(2030);
console.log(m.format('YYYY'));
Moment сохранит первоначальный год.
Это важно понимать при работе с изменяемыми объектами
Date.
Date перед передачейЧасто объект Date сначала модифицируется стандартными
методами JavaScript.
const date = new Date();
date.setHours(0);
date.setMinutes(0);
date.setSeconds(0);
const m = moment(date);
console.log(m.format('YYYY-MM-DD HH:mm:ss'));
Объект Date может хранить UTC-время.
const utcDate = new Date(Date.UTC(2026, 4, 21, 10, 0, 0));
const m = moment(utcDate);
console.log(m.format());
const utcDate = new Date(Date.UTC(2026, 4, 21, 10, 0, 0));
const m = moment.utc(utcDate);
console.log(m.format());
Результат:
2026-05-21T10:00:00Z
moment() и moment.utc()moment(date)Интерпретирует дату в локальной временной зоне.
const date = new Date();
moment(date);
moment.utc(date)Принудительно переводит значение в UTC.
moment.utc(date);
Многие браузерные API возвращают именно Date.
const start = new Date();
setTimeout(() => {
const end = new Date();
const startMoment = moment(start);
const endMoment = moment(end);
console.log(endMoment.diff(startMoment, 'seconds'));
}, 3000);
const inputValue = '2026-05-21';
const date = new Date(inputValue);
const m = moment(date);
console.log(m.format('DD.MM.YYYY'));
Date внутри хранит время как количество миллисекунд с 1
января 1970 года.
Moment полностью поддерживает эту модель.
const date = new Date(1716278400000);
const m = moment(date);
console.log(m.format());
DateMoment умеет возвращать стандартный объект JavaScript.
const m = moment();
const date = m.toDate();
console.log(date instanceof Date);
Результат:
true
Dateconst date = new Date();
const m = moment(date);
m.add(5, 'days');
console.log(date);
console.log(m.format());
Исходный объект Date останется неизменным.
Date после создания Momentconst date = new Date();
const m = moment(date);
date.setMonth(11);
console.log(m.format());
Moment не обновится автоматически, поскольку хранит собственное состояние.
Если Date содержит некорректное значение, Moment также
станет невалидным.
const invalidDate = new Date('wrong');
const m = moment(invalidDate);
console.log(m.isValid());
Результат:
false
const date = new Date();
const m = moment(date);
console.log(m.toDate().getTime() === date.getTime());
Результат:
true
const createdAt = new Date(2026, 0, 1);
const m = moment(createdAt);
console.log(m.fromNow());
Пример результата:
5 months ago
const dates = [
new Date(2026, 0, 1),
new Date(2026, 1, 1),
new Date(2026, 2, 1)
];
const moments = dates.map(date => moment(date));
moments.forEach(item => {
console.log(item.format('YYYY-MM-DD'));
});
При создании из Date Moment использует локальную
временную зону среды выполнения.
const date = new Date();
const m = moment(date);
console.log(m.utcOffset());
180
Это означает UTC+3.
Иногда требуется независимая копия.
const date = new Date();
const m1 = moment(date);
const m2 = moment(date);
m1.add(1, 'day');
console.log(m1.format());
console.log(m2.format());
Объекты будут разными.
moment-timezoneПри подключении расширения moment-timezone можно
преобразовывать объект Date в нужную временную зону.
const date = new Date();
const m = moment(date).tz('Europe/Berlin');
console.log(m.format());
Moment хранит исходный Date во внутреннем свойстве:
const m = moment();
console.log(m._d);
Однако прямой доступ к _d считается плохой практикой,
поскольку это внутреннее API библиотеки.
function formatUserDate(date) {
return moment(date).format('DD.MM.YYYY HH:mm');
}
const createdAt = new Date();
console.log(formatUserDate(createdAt));
Datemoment('2026-05-21')
Это уже не создание из Date, а парсинг строки.
new Date(2026, 5, 1)
Это июнь, а не май.
Dateconst date = new Date();
const m = moment(date);
date.setDate(1);
Moment не синхронизируется автоматически.
Date особенно полезноМногие библиотеки возвращают именно Date:
Если проект уже использует Date, Moment позволяет
постепенно расширить функциональность без полной переработки.
const date = new Date();
console.log(
moment(date).format('dddd, D MMMM YYYY')
);
| Возможность | Date | Moment |
|---|---|---|
| Форматирование | Ограничено | Богатый API |
| Работа с локалями | Сложно | Встроено |
| Манипуляции датами | Неудобно | Удобно |
| Сравнение дат | Ручное | Простые методы |
| Относительное время | Нет | Есть |
Date и
MomentНа практике часто используется следующая схема:
Date.toDate() при необходимости.const nativeDate = new Date();
const processed = moment(nativeDate)
.add(7, 'days')
.startOf('day');
const result = processed.toDate();
console.log(result);