Операторы сравнения и valueOf

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

Преобразование объектов Moment к числовому типу

Метод valueOf() возвращает число миллисекунд, прошедших с начала эпохи Unix (1 января 1970 года 00:00:00 UTC) для конкретного объекта Moment. Это позволяет использовать стандартные операторы сравнения JavaScript (<, >, <=, >=, ===, !==) для сравнения дат.

const momentA = moment('2026-05-21T10:00:00');
const momentB = moment('2026-05-21T12:00:00');

console.log(momentA.valueOf()); // 1763844000000
console.log(momentB.valueOf()); // 1763851200000

console.log(momentA.valueOf() < momentB.valueOf()); // true

Метод valueOf автоматически вызывается при неявном приведении объекта Moment к числу в выражениях сравнения, что делает сравнение особенно удобным:

console.log(momentA < momentB); // true
console.log(momentA > momentB); // false

Прямое сравнение объектов Moment

Хотя стандартные операторы позволяют сравнивать объекты Moment через valueOf, Moment.js также предоставляет встроенные методы для более читаемого и семантически точного сравнения:

  • isBefore(): проверяет, наступает ли момент раньше указанного.
  • isAfter(): проверяет, наступает ли момент позже указанного.
  • isSame(): проверяет точное совпадение по времени.
  • isSameOrBefore(): комбинация isSame() и isBefore().
  • isSameOrAfter(): комбинация isSame() и isAfter().

Примеры использования:

console.log(momentA.isBefore(momentB));        // true
console.log(momentA.isAfter(momentB));         // false
console.log(momentA.isSame(momentB));          // false
console.log(momentA.isSameOrBefore(momentB));  // true
console.log(momentA.isSameOrAfter(momentB));   // false

Эти методы позволяют учитывать тонкости временных сравнений, такие как точность до миллисекунд, без необходимости вручную использовать valueOf().

Сравнение по единицам времени

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

const momentC = moment('2026-05-21T10:30:00');

console.log(momentA.isSame(momentC, 'day'));   // true
console.log(momentA.isSame(momentC, 'hour'));  // false

Второй параметр может принимать следующие значения: 'year', 'month', 'week', 'day', 'hour', 'minute', 'second', 'millisecond'. Это позволяет гибко управлять сравнением без необходимости вручную извлекать отдельные компоненты даты.

Особенности операторов сравнения

Использование стандартных операторов (<, >, <=, >=) напрямую с объектами Moment работает, потому что Moment реализует метод valueOf. Однако важно помнить, что строгие сравнения (===, !==) будут проверять ссылку на объект, а не временное значение:

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

console.log(momentA === momentD); // false, разные объекты
console.log(momentA.valueOf() === momentD.valueOf()); // true, одинаковое время

Это ключевой момент: для точного сравнения времени следует использовать valueOf() или встроенные методы Moment.js.

Работа с диапазонами дат

Операторы сравнения и valueOf() особенно полезны при проверке диапазонов дат. Пример:

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

const inRange = current.valueOf() >= start.valueOf() && current.valueOf() <= end.valueOf();
console.log(inRange); // true

Аналогичная проверка может быть выполнена через метод isBetween:

console.log(current.isBetween(start, end)); // true

Метод isBetween позволяет дополнительно указать, включать ли границы диапазона ('[]' — включительно, '()' — исключительно):

console.log(current.isBetween(start, end, null, '[]')); // true, включает границы

Практические рекомендации

  • Для простых сравнений и условий диапазона можно использовать <, >, <=, >=, так как Moment автоматически приводит объекты к числу через valueOf.
  • Для семантически читаемого кода и более точного контроля следует использовать методы isBefore, isAfter, isSame, isBetween.
  • Всегда учитывать, что строгие сравнения (===, !==) проверяют объектную ссылку, а не значение времени.
  • Для сравнения по единицам времени или округлению до дней, часов или минут вторым аргументом указывать нужную единицу времени.

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