В библиотеке date-fns работа с календарными датами строится вокруг чистых функций, каждая из которых решает строго определённую задачу. Одной из таких функций является вычисление разницы между датами с учётом только рабочих дней — выходные и праздничные периоды исключаются из расчёта.
В контексте приложений, где важны сроки выполнения задач, SLA, логистика или бизнес-процессы, календарная разница часто оказывается недостаточной. Две даты могут находиться далеко друг от друга по календарю, но включать значительное количество выходных, которые не должны учитываться.
Рабочими днями считаются дни недели, которые не относятся к выходным. В стандартной модели:
В библиотеке date-fns этот подход реализован через функции, которые опираются на внутреннюю модель календаря без учёта праздников (если они не заданы отдельно через дополнительные механизмы приложения).
Ключевая функция для расчёта разницы в рабочих днях:
differenceInBusinessDays(dateLeft, dateRight)
dateLeft — конечная датаdateRight — начальная датаФункция возвращает целое число, которое может быть:
dateLeft позже
dateRightdateLeft раньше
dateRightАлгоритм вычисления в date-fns основан на последовательном определении каждого дня между двумя датами с фильтрацией:
Фактически функция эквивалентна подсчёту количества “активных” дней между двумя точками календаря.
import { differenceInBusinessDays } from 'date-fns'
const start = new Date(2026, 0, 5) // понедельник
const end = new Date(2026, 0, 12) // понедельник следующей недели
differenceInBusinessDays(end, start)
// 5
В данном случае учитываются только рабочие дни: понедельник–пятница.
const start = new Date(2026, 0, 8) // четверг
const end = new Date(2026, 0, 15) // четверг следующей недели
differenceInBusinessDays(end, start)
// 5
Несмотря на то, что календарная разница составляет 7 дней, два выходных дня исключаются.
const start = new Date(2026, 0, 15)
const end = new Date(2026, 0, 8)
differenceInBusinessDays(end, start)
// -5
Отрицательный результат отражает направление интервала.
В date-fns даты сравниваются с точностью до дня, игнорируя время внутри суток.
Это означает:
По умолчанию выходными считаются:
Функция не учитывает государственные праздники, поскольку в базовой модели date-fns отсутствует встроенный календарь праздников. Для таких случаев применяется внешняя логика на уровне приложения.
В системах управления задачами разница в рабочих днях используется для оценки реального времени выполнения:
differenceInBusinessDays(deadline, createdAt)
Это позволяет игнорировать периоды, когда работа фактически не выполняется.
При расчёте сроков доставки:
differenceInBusinessDays(deliveryDate, shipmentDate)
В финансовых системах рабочие дни используются для:
В базовой реализации date-fns неделя всегда имеет фиксированную структуру (понедельник–воскресенье), независимо от региона.
Это означает:
В отличие от differenceInDays, функция
differenceInBusinessDays исключает выходные:
Пример:
differenceInDays(end, start) // 7
differenceInBusinessDays(end, start) // 5
Такое различие критично в доменах, где важна реальная доступность рабочих ресурсов.
differenceInBusinessDays(date, date)
// 0
Если обе даты совпадают и приходятся на рабочий день, результат всегда нулевой, поскольку интервал отсутствует.
Логика date-fns оптимизирована и не требует ручной итерации по каждому дню в пользовательском коде. Вместо этого используется математическая нормализация диапазона:
Такой подход делает функцию предсказуемой по производительности даже на больших диапазонах дат.
Частые проблемы при работе с рабочими днями:
differenceInDays и
differenceInBusinessDaysКорректная работа требует чёткого понимания семантики рабочих дней в рамках модели date-fns.