Функция isSameDay из библиотеки date-fns
предназначена для проверки принадлежности двух дат к одному календарному
дню. Сравнение выполняется на основе года, месяца и числа, без учёта
времени.
isSameDay(dateLeft, dateRight)
Date или
значение, приводимое к Date)Date или
значение, приводимое к Date)Сравнение выполняется по локальному времени:
Временная составляющая (часы, минуты, секунды, миллисекунды) игнорируется полностью.
При работе с временными зонами важно учитывать, что Date
в JavaScript всегда хранит момент времени в UTC, но методы сравнения в
date-fns используют локальное представление даты.
Это приводит к тому, что две даты, находящиеся в разных часовых поясах, могут давать неожиданный результат при ручной интерпретации времени, но корректный — при использовании локального календаря.
import { isSameDay } from 'date-fns';
const a = new Date(2026, 0, 10, 10, 0);
const b = new Date(2026, 0, 10, 23, 59);
isSameDay(a, b); // true
const a = new Date(2026, 0, 10, 23, 59);
const b = new Date(2026, 0, 11, 0, 1);
isSameDay(a, b); // false
Функция isSameWeek выполняет проверку принадлежности
двух дат одной календарной неделе с учётом локальных правил начала
недели.
isSameWeek(dateLeft, dateRight, options?)
{
weekStartsOn?: 0 | 1 | 2 | 3 | 4 | 5 | 6,
locale?: Locale
}
weekStartsOn — определяет день начала недели
locale — локаль, определяющая правила недели (например, европейские или американские стандарты)
Алгоритм вычисляет границы недели для каждой даты и проверяет, совпадают ли они:
dateLeftdateRightЕсли обе даты попадают в один и тот же диапазон недели, результатом
становится true.
Разные стандарты недели приводят к различным результатам:
weekStartsOn: 0 неделя начинается в
воскресеньеweekStartsOn: 1 неделя начинается в
понедельникЭто критично для аналитических систем, где неделя является единицей агрегации данных.
Также учитывается локаль, которая может переопределять стандартное начало недели.
import { isSameWeek } from 'date-fns';
const a = new Date(2026, 4, 18);
const b = new Date(2026, 4, 20);
isSameWeek(a, b, { weekStartsOn: 1 }); // true
const a = new Date(2026, 4, 18);
const b = new Date(2026, 4, 25);
isSameWeek(a, b, { weekStartsOn: 1 }); // false
При переходе через границу года неделя может включать дни из двух разных календарных лет. В таких случаях сравнение производится исключительно по вычисленным границам недели, а не по номеру года.
Функция isSameMonth определяет, принадлежат ли две даты
одному календарному месяцу.
isSameMonth(dateLeft, dateRight)
Проверяются два компонента:
День месяца и время не учитываются.
Сравнение происходит в локальном времени, что важно при работе с датами, полученными из разных источников (API, базы данных, пользовательский ввод).
Месяцы в JavaScript индексируются с нуля:
Это влияет на интерпретацию при ручном создании дат через
new Date(year, monthIndex, day).
import { isSameMonth } from 'date-fns';
const a = new Date(2026, 0, 1);
const b = new Date(2026, 0, 31);
isSameMonth(a, b); // true
const a = new Date(2026, 0, 31);
const b = new Date(2026, 1, 1);
isSameMonth(a, b); // false
Сравнение месяцев используется в интерфейсах календарей, где требуется группировка событий, фильтрация диапазонов дат и построение месячных представлений.
При работе с диапазонами дат важно учитывать, что переход между месяцами не всегда совпадает с количеством дней, а также может включать сезонные аномалии (например, февраль в високосный год).
Все три функции относятся к семейству сравнений календарных единиц времени, но оперируют разными уровнями гранулярности:
isSameDay — минимальная единица (день)isSameWeek — агрегированная неделя с настраиваемой
логикойisSameMonth — месячный интервал как календарная
сущностьИерархия точности:
day < week < month
Каждая функция игнорирует более мелкие временные компоненты относительно своей единицы измерения, обеспечивая консистентность календарных операций в приложениях, работающих с датами.