Сравнение с учетом гранулярности

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


Основные методы сравнения

Для базового сравнения Moment.js использует следующие методы:

  • isBefore()
  • isAfter()
  • isSame()
  • isSameOrBefore()
  • isSameOrAfter()

Эти методы принимают два аргумента:

  1. Дата для сравнения — другой объект Moment, строка в поддерживаемом формате, объект Date или timestamp.
  2. Гранулярность (необязательный) — строка, задающая уровень точности сравнения. Поддерживаемые значения:
'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 превращает стандартные методы сравнения дат в инструмент, пригодный для аналитики, фильтрации событий и временных диапазонов с любым уровнем детализации. Она позволяет легко адаптировать сравнения под конкретные бизнес- или пользовательские сценарии.