Метод isSame

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

Сигнатура метода:

dayjs().isSame(date)
dayjs().isSame(date, unit)

Базовая проверка равенства

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

const day1 = dayjs('2025-03-10')
const day2 = dayjs('2025-03-10')

console.log(day1.isSame(day2)) // true

Пример с разными значениями:

const day1 = dayjs('2025-03-10')
const day2 = dayjs('2025-03-11')

console.log(day1.isSame(day2)) // false

Сравнение с объектом Date

Метод принимает не только объект Day.js, но и стандартный Date.

const current = dayjs()
const nativeDate = new Date()

console.log(current.isSame(nativeDate))

Сравнение со строкой

В качестве аргумента можно передавать строку с датой.

const result = dayjs('2025-05-01').isSame('2025-05-01')

console.log(result) // true

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

Второй аргумент определяет уровень точности сравнения.

Поддерживаются следующие единицы:

  • year
  • month
  • week
  • day
  • hour
  • minute
  • second

Проверка совпадения года

const d1 = dayjs('2025-01-10')
const d2 = dayjs('2025-11-25')

console.log(d1.isSame(d2, 'year')) // true

Несмотря на разные месяцы и дни, год совпадает.

Проверка совпадения месяца

const d1 = dayjs('2025-03-01')
const d2 = dayjs('2025-03-29')

console.log(d1.isSame(d2, 'month')) // true

Если месяц отличается:

const d1 = dayjs('2025-03-31')
const d2 = dayjs('2025-04-01')

console.log(d1.isSame(d2, 'month')) // false

Проверка совпадения дня

const d1 = dayjs('2025-06-15 08:00')
const d2 = dayjs('2025-06-15 22:30')

console.log(d1.isSame(d2, 'day')) // true

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

Проверка совпадения часа

const d1 = dayjs('2025-06-15 10:15:00')
const d2 = dayjs('2025-06-15 10:59:59')

console.log(d1.isSame(d2, 'hour')) // true

Проверка совпадения минуты

const d1 = dayjs('2025-06-15 10:45:10')
const d2 = dayjs('2025-06-15 10:45:59')

console.log(d1.isSame(d2, 'minute')) // true

Проверка совпадения секунды

const d1 = dayjs('2025-06-15 10:45:30.100')
const d2 = dayjs('2025-06-15 10:45:30.900')

console.log(d1.isSame(d2, 'second')) // true

Краткие формы единиц времени

Day.js поддерживает сокращённые варианты:

Полная форма Краткая форма
year y
month M
week w
day d
hour h
minute m
second s

Пример:

const d1 = dayjs('2025-01-01')
const d2 = dayjs('2025-12-31')

console.log(d1.isSame(d2, 'y')) // true

Особенность каскадного сравнения

При использовании единицы времени Day.js сравнивает не только её, но и все более крупные единицы.

Например:

const d1 = dayjs('2025-03-10')
const d2 = dayjs('2026-03-10')

console.log(d1.isSame(d2, 'month')) // false

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

Логика сравнения для 'month':

  • проверяется год;
  • затем проверяется месяц.

Для 'day':

  • год;
  • месяц;
  • день.

Проверка текущей даты

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

console.log(isToday) // true

Проверка дня рождения

const birthday = dayjs('1995-08-20')
const today = dayjs()

const isBirthday = today.isSame(birthday, 'day') &&
                   today.isSame(birthday, 'month')

console.log(isBirthday)

Более корректный вариант:

const isBirthday =
    today.date() === birthday.date() &&
    today.month() === birthday.month()

Сравнение дат в массиве

const dates = [
    dayjs('2025-01-01'),
    dayjs('2025-01-01'),
    dayjs('2025-01-02')
]

const result = dates.filter(date =>
    date.isSame('2025-01-01', 'day')
)

console.log(result.length) // 2

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

При работе с часовыми поясами результаты могут отличаться.

dayjs.extend(utc)

const d1 = dayjs.utc('2025-01-01T00:00:00Z')
const d2 = dayjs('2025-01-01T03:00:00+03:00')

console.log(d1.isSame(d2)) // true

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

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

dayjs.extend(utc)
dayjs.extend(timezone)

const moscow = dayjs.tz('2025-06-01 12:00', 'Europe/Moscow')
const almaty = dayjs.tz('2025-06-01 14:00', 'Asia/Almaty')

console.log(moscow.isSame(almaty)) // true

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

const invalid = dayjs('invalid-date')

console.log(invalid.isValid()) // false
console.log(invalid.isSame(dayjs())) // false

Если хотя бы одна дата невалидна, метод возвращает false.

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

const isCurrentHour = dayjs('2025-06-10 15:20')
    .isSame(dayjs(), 'hour')

console.log(isCurrentHour)

Проверка принадлежности к одному кварталу

Для работы с кварталами требуется плагин QuarterOfYear.

dayjs.extend(quarterOfYear)

const d1 = dayjs('2025-02-15')
const d2 = dayjs('2025-03-20')

console.log(d1.isSame(d2, 'quarter')) // true

Проверка принадлежности к одной неделе

Для недель используется единица week.

const d1 = dayjs('2025-05-12')
const d2 = dayjs('2025-05-16')

console.log(d1.isSame(d2, 'week'))

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

Отличие isSame от обычного сравнения

Сравнение через операторы:

day1 === day2

не работает корректно для объектов Day.js.

Пример:

const d1 = dayjs('2025-01-01')
const d2 = dayjs('2025-01-01')

console.log(d1 === d2) // false

Каждый вызов dayjs() создаёт новый объект.

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

console.log(d1.isSame(d2)) // true

Сравнение через valueOf

Метод valueOf() возвращает timestamp в миллисекундах.

const d1 = dayjs('2025-01-01')
const d2 = dayjs('2025-01-01')

console.log(d1.valueOf() === d2.valueOf()) // true

Однако isSame удобнее и читаемее.

Практический пример: проверка активности сессии

const lastActivity = dayjs('2025-06-01 14:25')
const currentTime = dayjs()

const activeNow = lastActivity.isSame(currentTime, 'minute')

console.log(activeNow)

Практический пример: группировка по дням

const messages = [
    { text: 'A', date: dayjs('2025-06-01 10:00') },
    { text: 'B', date: dayjs('2025-06-01 15:00') },
    { text: 'C', date: dayjs('2025-06-02 09:00') }
]

const sameDayMessages = messages.filter(message =>
    message.date.isSame('2025-06-01', 'day')
)

console.log(sameDayMessages)

Практический пример: проверка дедлайна

const deadline = dayjs('2025-07-01')
const today = dayjs()

if (today.isSame(deadline, 'day')) {
    console.log('Последний день')
}

Комбинирование с другими методами

Совместно с isBefore

const start = dayjs('2025-01-01')
const current = dayjs('2025-01-10')

const result =
    current.isSame(start, 'month') ||
    current.isBefore(start)

console.log(result)

Совместно с isAfter

const paymentDate = dayjs('2025-06-10')
const now = dayjs()

if (now.isAfter(paymentDate) && !now.isSame(paymentDate, 'day')) {
    console.log('Платёж просрочен')
}

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

isSame работает быстро, поскольку сравнение основано на числовых timestamp-значениях. Метод подходит для:

  • фильтрации больших массивов;
  • календарей;
  • систем расписаний;
  • аналитики;
  • проверки интервалов;
  • realtime-приложений.

Частые ошибки

Сравнение объектов через ===

dayjs() === dayjs()

Результат всегда будет false.

Неверная единица времени

d1.isSame(d2, 'days')

Следует использовать:

d1.isSame(d2, 'day')

Игнорирование часового пояса

const d1 = dayjs.utc('2025-01-01T00:00:00Z')
const d2 = dayjs('2025-01-01T00:00:00')

Эти значения могут представлять разные моменты времени.

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

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

Ключевые особенности isSame

  • сравнивает даты с разной точностью;
  • поддерживает строки, Date и объекты Day.js;
  • учитывает timezone и UTC;
  • работает с плагинами;
  • удобнее прямого сравнения timestamp;
  • поддерживает каскадную проверку единиц времени.