Разница в различных единицах времени

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() и другие для удобного преобразования.

Разница в днях, неделях и годах

  • Дни: вычисляются как полные календарные дни.
  • Недели: деление количества дней на 7, результат можно получить как целое число или дробное.
  • Годы и месяцы: вычисляются на основе календаря, учитывая длину месяцев и високосные года.
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

Обратите внимание: разница в месяцах и годах учитывает реальные календарные даты, а не фиксированное количество дней.

Duration и сложные вычисления

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

Такой подход особенно полезен при работе с отчетами, таймерами, календарными событиями и аналитикой времени.

Важные нюансы при вычислениях

  1. Разница в месяцах и годах зависит от календарных дат, а не от числа дней.
  2. Метод .diff() возвращает отрицательные значения, если первый момент позже второго.
  3. Для корректной работы с часовыми поясами рекомендуется использовать Moment Timezone, так как смещение часового пояса может влиять на разницу в днях и часах.

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