Moment.js предоставляет мощные возможности для работы с датами и
временем в JavaScript, включая удобные средства для их сравнения.
Понимание того, как правильно использовать операторы сравнения и метод
valueOf, критически важно для корректной работы с
временными значениями.
Метод 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 через
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 и операторы сравнения образуют фундамент для
работы с временными условиями, создавая основу для более сложных
операций: фильтрации, сортировки и вычисления разницы между датами.