Moment.js предоставляет мощный набор инструментов для работы с датами и временем, включая возможность сравнения объектов Moment с учётом определённой гранулярности. Гранулярность позволяет ограничивать точность сравнения до уровня года, месяца, дня, часа, минуты и других единиц времени, что делает операции сравнения более гибкими и соответствующими реальным задачам.
Для базового сравнения Moment.js использует следующие методы:
isBefore()isAfter()isSame()isSameOrBefore()isSameOrAfter()Эти методы принимают два аргумента:
'year', 'month', 'week', 'day', 'hour', 'minute', 'second', 'millisecond'
Если гранулярность не указана, сравнение происходит с точностью до миллисекунд.
const moment = require('moment');
const date1 = moment('2026-05-21T15:30:00');
const date2 = moment('2026-05-21T18:45:00');
// Сравнение только по дню
console.log(date1.isSame(date2, 'day')); // true
// Сравнение по часу
console.log(date1.isSame(date2, 'hour')); // false
// Сравнение по году
console.log(date1.isBefore(date2, 'year')); // false
В данном примере видно, что, ограничив точность сравнения до дня, мы считаем обе даты одинаковыми, несмотря на различие во времени.
Гранулярность 'week' учитывает локальные настройки
первого дня недели. В Moment.js можно определить первый день недели
через локаль:
moment.locale('ru'); // Понедельник — первый день недели
const monday = moment('2026-05-18');
const sunday = moment('2026-05-24');
console.log(monday.isSame(sunday, 'week')); // true
Если локаль отличается, результат может измениться. Это важно учитывать при глобальных приложениях, где пользователи из разных регионов.
Гранулярности 'hour', 'minute',
'second' позволяют игнорировать более мелкие единицы при
сравнении. Например:
const time1 = moment('2026-05-21T10:15:30');
const time2 = moment('2026-05-21T10:15:45');
console.log(time1.isSame(time2, 'minute')); // true
console.log(time1.isSame(time2, 'second')); // false
Здесь видно, что при сравнении по минутам секунды игнорируются, а при сравнении по секундам — учитываются.
Методы isBefore() и isAfter() также
принимают гранулярность, что позволяет реализовать гибкие условия:
const start = moment('2026-05-21');
const end = moment('2026-05-25');
console.log(start.isBefore(end, 'day')); // true
console.log(start.isAfter(end, 'month')); // false
Сравнение по месяцам игнорирует конкретные дни и время, ориентируясь только на год и месяц.
Гранулярность особенно полезна при фильтрации массивов дат. Например, можно выделить все события, произошедшие в одном месяце:
const events = [
moment('2026-05-01'),
moment('2026-05-15'),
moment('2026-06-03')
];
const mayEvents = events.filter(e => e.isSame(moment('2026-05-01'), 'month'));
console.log(mayEvents.length); // 2
Таким образом, гранулярность позволяет легко группировать и фильтровать данные без необходимости вручную извлекать компоненты даты.
'week' для корректного
расчета недель.isSame, isBefore и
isAfter для сложных условий (например, проверка диапазонов
с нужной точностью).Гранулярность сравнения в Moment.js превращает стандартные методы сравнения дат в инструмент, пригодный для аналитики, фильтрации событий и временных диапазонов с любым уровнем детализации. Она позволяет легко адаптировать сравнения под конкретные бизнес- или пользовательские сценарии.