Вычисление разницы в миллисекундах

В библиотеке Moment.js работа с датами и временем осуществляется с помощью объектов moment(), которые предоставляют широкий набор методов для вычислений и форматирования. Одной из часто используемых операций является вычисление разницы между двумя моментами времени.

Метод diff()

Для получения разницы между двумя датами используется метод diff. Синтаксис метода следующий:

momentA.diff(momentB, unit, floating)
  • momentA — объект Moment, от которого производится вычитание.
  • momentB — объект Moment, который вычитается.
  • unit — единица измерения разницы. Возможные значения: 'milliseconds', 'seconds', 'minutes', 'hours', 'days', 'weeks', 'months', 'years'. Если параметр не указан, разница возвращается в миллисекундах по умолчанию.
  • floating — логическое значение (true или false). Если true, результат возвращается в виде дробного числа. Если false или не указан, результат округляется вниз до целого числа.

Разница в миллисекундах

По умолчанию diff возвращает разницу в миллисекундах, что позволяет производить точные вычисления без потери точности:

const start = moment('2026-05-21T10:00:00');
const end = moment('2026-05-21T10:00:05');

const diffMs = end.diff(start); // 5000 миллисекунд

Особенности:

  1. Результат положительный, если первый момент позже второго. Если момент A раньше B, результат будет отрицательным:
const diffNegative = start.diff(end); // -5000
  1. Использование единицы 'milliseconds' делает вычисление максимально точным и пригодным для таймеров, логирования событий и высокоточных измерений.

Использование с дробными миллисекундами

Если требуется дробная точность, можно применить третий параметр true:

const start = moment('2026-05-21T10:00:00.123');
const end = moment('2026-05-21T10:00:01.456');

const diffMsFloating = end.diff(start, 'milliseconds', true); // 1333.0

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

Сравнение дат через миллисекунды

Метод diff позволяет не только вычислять разницу, но и использовать её для логики сравнения:

if (moment().diff(moment('2026-05-21T12:00:00')) > 0) {
    console.log('Событие уже прошло');
} else {
    console.log('Событие ещё впереди');
}

Такой подход эффективен при работе с таймерами, дедлайнами и проверкой сроков в реальном времени.

Преобразование миллисекунд в другие единицы

Хотя diff может сразу вернуть значение в нужной единице, иногда удобно сначала получить миллисекунды, а затем преобразовать их вручную:

const diffMs = end.diff(start); // 5000 миллисекунд
const diffSeconds = diffMs / 1000; // 5 секунд
const diffMinutes = diffMs / (1000 * 60); // 0.0833 минуты

Такой способ полезен при накоплении статистики и последующем форматировании интервалов.

Рекомендации по производительности

  1. Использование одного формата даты: при создании объектов Moment стараться использовать один формат ISO или стандартный формат строки, чтобы избежать неоднозначностей.
  2. Минимизация повторных вычислений: если разница между одними и теми же датами требуется многократно, лучше вычислить её один раз и сохранить в переменной.
  3. Учёт часовых поясов: метод diff учитывает временные зоны объектов Moment. Для корректных вычислений в разных часовых поясах рекомендуется использовать метод .utc() или явно указывать смещение времени.

Пример комплексного использования

const start = moment('2026-05-21T08:30:15.500');
const end = moment('2026-05-21T10:45:30.750');

const diffMs = end.diff(start); // 8130250 миллисекунд
const diffSeconds = diffMs / 1000; // 8130.25 секунд
const diffMinutes = diffMs / (1000 * 60); // 135.5041667 минут
const diffHours = diffMs / (1000 * 60 * 60); // 2.25840278 часов

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