Moment.js предоставляет удобный и интуитивно понятный интерфейс для работы с датами и временем в JavaScript, включая вычисление разницы между моментами времени в различных единицах: миллисекундах, секундах, минутах, часах, днях, неделях, месяцах и годах.
diff()Основной инструмент для вычисления разницы — метод
diff(), который используется следующим
образом:
const moment = require('moment');
const start = moment('2026-05-01');
const end = moment('2026-05-21');
const diffDays = end.diff(start, 'days'); // Разница в днях
const diffMonths = end.diff(start, 'months'); // Разница в месяцах
'milliseconds', 'seconds',
'minutes', 'hours', 'days',
'weeks', 'months', 'years').true
позволяет получить дробное значение разницы:const diffDaysFraction = end.diff(start, 'days', true); // 20.0
Moment.js хранит дату и время как число миллисекунд с начала эпохи
UNIX (1 января 1970). Метод diff() по умолчанию может
возвращать разницу именно в этих миллисекундах:
const diffMilliseconds = end.diff(start); // без второго аргумента — миллисекунды
Для преобразования можно использовать встроенные методы библиотеки:
const diffSeconds = moment.duration(diffMilliseconds).asSeconds();
const diffMinutes = moment.duration(diffMilliseconds).asMinutes();
moment.duration() создаёт объект
Duration, который предоставляет методы
.asSeconds(), .asMinutes(),
.asHours() и другие для удобного преобразования.
const start = moment('2024-02-28');
const end = moment('2025-03-01');
const diffYears = end.diff(start, 'years'); // 1
const diffMonths = end.diff(start, 'months'); // 12
const diffDays = end.diff(start, 'days'); // 367
Обратите внимание: разница в месяцах и годах учитывает реальные календарные даты, а не фиксированное количество дней.
Moment.js позволяет создавать объекты длительности для последующих вычислений:
const duration = moment.duration(end.diff(start));
console.log(duration.years()); // 1
console.log(duration.months()); // 0 (оставшиеся месяцы после учёта полных лет)
console.log(duration.days()); // 1 (оставшиеся дни)
.years() и .months() возвращают целые
значения полных лет и месяцев..days() возвращает остаток дней после вычитания полных
месяцев..asDays(), .asMonths() и
т.д.При работе с временем внутри дня важно учитывать часы, минуты и
секунды. Метод diff() корректно учитывает их:
const start = moment('2026-05-21 08:30:00');
const end = moment('2026-05-21 12:45:00');
const diffHours = end.diff(start, 'hours'); // 4
const diffMinutes = end.diff(start, 'minutes'); // 255
const diffSeconds = end.diff(start, 'seconds'); // 15300
Использование третьего аргумента true позволит получить
дробное значение:
const diffHoursFraction = end.diff(start, 'hours', true); // 4.25
Moment.js делает возможным не только вычисление разницы, но и условные проверки:
if (end.diff(start, 'days') > 30) {
console.log('Прошёл более месяца');
}
Можно комбинировать длительности и сложные вычисления:
const duration = moment.duration(end.diff(start));
const totalHours = duration.asHours();
const weeks = Math.floor(duration.asWeeks());
Такой подход особенно полезен при работе с отчетами, таймерами, календарными событиями и аналитикой времени.
.diff() возвращает отрицательные
значения, если первый момент позже второго.Moment.js объединяет простоту синтаксиса с мощными возможностями точного вычисления разницы времени, что делает библиотеку незаменимой для сложных манипуляций с датами и длительностями в JavaScript.