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

Объект 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

Копирование данных из Date

Moment копирует значение даты, а не хранит ссылку на исходный объект.

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'));

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

Объект Date может хранить UTC-время.

const utcDate = new Date(Date.UTC(2026, 4, 21, 10, 0, 0));

const m = moment(utcDate);

console.log(m.format());

Работа с UTC через Moment

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

Многие браузерные 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());

Преобразование обратно в Date

Moment умеет возвращать стандартный объект JavaScript.

const m = moment();

const date = m.toDate();

console.log(date instanceof Date);

Результат:

true

Изменение Moment не влияет на исходный Date

const date = new Date();

const m = moment(date);

m.add(5, 'days');

console.log(date);
console.log(m.format());

Исходный объект Date останется неизменным.

Изменение Date после создания Moment

const 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

Сравнение объектов

Сравнение Moment и Date

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.

Создание копии Moment из Date

Иногда требуется независимая копия.

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));

Частые ошибки

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

moment('2026-05-21')

Это уже не создание из Date, а парсинг строки.

Путаница с месяцами

new Date(2026, 5, 1)

Это июнь, а не май.

Изменение исходного Date

const date = new Date();

const m = moment(date);

date.setDate(1);

Moment не синхронизируется автоматически.

Когда создание из Date особенно полезно

Интеграция со сторонними библиотеками

Многие библиотеки возвращают именно Date:

  • DatePicker;
  • браузерные API;
  • календарные компоненты;
  • ORM;
  • серверные SDK.

Работа с существующим кодом

Если проект уже использует Date, Moment позволяет постепенно расширить функциональность без полной переработки.

Удобное форматирование

const date = new Date();

console.log(
    moment(date).format('dddd, D MMMM YYYY')
);

Сравнение возможностей

Возможность Date Moment
Форматирование Ограничено Богатый API
Работа с локалями Сложно Встроено
Манипуляции датами Неудобно Удобно
Сравнение дат Ручное Простые методы
Относительное время Нет Есть

Комбинирование Date и Moment

На практике часто используется следующая схема:

  1. Получение даты через Date.
  2. Передача в Moment.
  3. Форматирование или вычисления.
  4. Возврат обратно через toDate() при необходимости.
const nativeDate = new Date();

const processed = moment(nativeDate)
    .add(7, 'days')
    .startOf('day');

const result = processed.toDate();

console.log(result);