Указание единиц сравнения

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

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


Сравнение без указания единицы

По умолчанию Day.js сравнивает полную временную метку вплоть до миллисекунд.

const date1 = dayjs('2025-03-10T12:00:00')
const date2 = dayjs('2025-03-10T18:00:00')

date1.isSame(date2)

Результат:

false

Несмотря на одинаковый календарный день, время отличается.


Указание единицы сравнения

Вторым аргументом методов сравнения можно передать единицу времени.

date1.isSame(date2, 'day')

Результат:

true

Теперь сравнение выполняется только на уровне дня.


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

Day.js предоставляет несколько методов:

Метод Назначение
isSame() Проверка равенства
isBefore() Проверка, что дата раньше
isAfter() Проверка, что дата позже
isSameOrBefore() Равна или раньше
isSameOrAfter() Равна или позже

Некоторые методы доступны через плагины.


Метод isSame

Сравнение по году

const a = dayjs('2025-01-10')
const b = dayjs('2025-11-20')

a.isSame(b, 'year')

Результат:

true

Сравнивается только год.


Сравнение по месяцу

a.isSame(b, 'month')

Результат:

false

Месяцы различаются.


Сравнение по дню

const a = dayjs('2025-03-10 08:00')
const b = dayjs('2025-03-10 23:59')

a.isSame(b, 'day')

Результат:

true

Время игнорируется.


Метод isBefore

Проверка по месяцу

const start = dayjs('2025-02-15')
const finish = dayjs('2025-05-01')

start.isBefore(finish, 'month')

Результат:

true

Проверка по году

start.isBefore(finish, 'year')

Результат:

false

Обе даты находятся в одном году.


Метод isAfter

Проверка по дню

const current = dayjs('2025-06-10')
const old = dayjs('2025-06-01')

current.isAfter(old, 'day')

Результат:

true

Проверка по месяцу

current.isAfter(old, 'month')

Результат:

false

Обе даты принадлежат одному месяцу.


Поддерживаемые единицы времени

Day.js поддерживает следующие единицы:

Единица Краткая форма
year y
month M
week w
day d
hour h
minute m
second s
millisecond ms

Полные и краткие формы

Допускается использование сокращений.

date1.isSame(date2, 'month')
date1.isSame(date2, 'M')

Оба варианта эквивалентны.


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

Сравнение включает старшие единицы

При сравнении по месяцу учитывается также год.

const a = dayjs('2024-05-10')
const b = dayjs('2025-05-10')

a.isSame(b, 'month')

Результат:

false

Несмотря на одинаковый месяц, годы различаются.


Сравнение по дню учитывает месяц и год

const a = dayjs('2025-03-15')
const b = dayjs('2025-04-15')

a.isSame(b, 'day')

Результат:

false

Сравниваются не только числа месяца.


Практические сценарии

Проверка текущего дня

const isToday = inputDate.isSame(dayjs(), 'day')

Проверка текущего месяца

const isCurrentMonth = inputDate.isSame(dayjs(), 'month')

Проверка просроченной даты

const expired = dayjs().isAfter(expireDate, 'day')

Проверка будущего года

const future = targetDate.isAfter(dayjs(), 'year')

Сравнение времени внутри суток

Сравнение по часам

const a = dayjs('2025-05-10 10:30')
const b = dayjs('2025-05-10 10:59')

a.isSame(b, 'hour')

Результат:

true

Сравнение по минутам

a.isSame(b, 'minute')

Результат:

false

Использование плагинов

Некоторые методы требуют подключения дополнительных модулей.

Плагин isSameOrBefore

import isSameOrBefore from 'dayjs/plugin/isSameOrBefore'

dayjs.extend(isSameOrBefore)

Использование:

date1.isSameOrBefore(date2, 'day')

Плагин isSameOrAfter

import isSameOrAfter from 'dayjs/plugin/isSameOrAfter'

dayjs.extend(isSameOrAfter)

Использование:

date1.isSameOrAfter(date2, 'month')

Сравнение диапазонов

Указание единицы особенно полезно при работе с периодами.

Проверка попадания в текущую неделю

const currentWeek = date.isSame(dayjs(), 'week')

Проверка одного квартала

После подключения плагина QuarterOfYear:

date1.isSame(date2, 'quarter')

Распространённые ошибки

Ошибка при сравнении только числа дня

const a = dayjs('2025-03-15')
const b = dayjs('2025-04-15')

a.date() === b.date()

Результат:

true

Такое сравнение некорректно, потому что игнорируются месяц и год.

Правильный вариант:

a.isSame(b, 'day')

Ошибка из-за времени

const a = dayjs('2025-05-01 00:00')
const b = dayjs('2025-05-01 23:59')

a.isSame(b)

Результат:

false

Исправление:

a.isSame(b, 'day')

Комбинирование с startOf

Иногда требуется предварительно нормализовать дату.

const a = dayjs().startOf('month')
const b = dayjs('2025-05-01')

a.isSame(b, 'day')

Сравнение после изменения даты

const nextMonth = dayjs().add(1, 'month')

nextMonth.isAfter(dayjs(), 'month')

Проверка одинакового часа независимо от даты

Иногда нужно сравнить только часы.

const a = dayjs('2025-01-01 10:30')
const b = dayjs('2030-12-20 10:45')

a.hour() === b.hour()

Метод isSame(..., 'hour') здесь не подходит, потому что он также учитывает день, месяц и год.


Проверка одинаковой минуты

const sameMinute =
    a.minute() === b.minute()

Работа с неделями

Сравнение по неделе

const a = dayjs('2025-05-12')
const b = dayjs('2025-05-16')

a.isSame(b, 'week')

Результат зависит от локали и настроек начала недели.


Работа с часовыми поясами

При использовании плагинов timezone и utc сравнение выполняется с учётом временной зоны объекта Day.js.

const moscow = dayjs.tz('2025-05-10 10:00', 'Europe/Moscow')
const london = dayjs.tz('2025-05-10 08:00', 'Europe/London')

moscow.isSame(london)

Результат может быть:

true

Если обе даты представляют один и тот же момент времени.


Производительность

Сравнение через встроенные методы Day.js обычно эффективнее ручного разложения даты:

date1.isSame(date2, 'day')

вместо:

date1.year() === date2.year() &&
date1.month() === date2.month() &&
date1.date() === date2.date()

Встроенные методы делают код компактнее и уменьшают вероятность ошибок.


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

Использование единиц сравнения вместо ручной проверки

Предпочтительно:

date1.isSame(date2, 'month')

Нежелательно:

date1.month() === date2.month() &&
date1.year() === date2.year()

Явное указание единицы

Если важен только календарный день, единицу лучше указывать явно:

eventDate.isSame(dayjs(), 'day')

Это делает намерение кода очевидным.


Краткое сравнение методов

Выражение Назначение
isSame(date, 'day') Один календарный день
isBefore(date, 'month') Раньше по месяцу
isAfter(date, 'year') Позже по году
isSameOrBefore(date, 'hour') Не позже часа
isSameOrAfter(date, 'minute') Не раньше минуты