Определение рабочих дней

Рабочие дни (business days) в JavaScript-календарях — это дни, исключающие выходные и, при необходимости, официальные праздничные даты. В прикладной разработке такие расчёты используются при планировании задач, расчёте сроков доставки, SLA, финансовых операций и расписаний.

В Day.js работа с рабочими днями реализуется через подключаемый модуль businessDays, который расширяет базовую функциональность библиотеки и добавляет методы для проверки и арифметики дат с учётом календаря рабочего времени.


Подключение и расширение функциональности

Day.js по умолчанию не содержит логики рабочих дней. Для её включения используется плагин:

import dayjs from 'dayjs'
import businessDays from 'dayjs/plugin/businessDays'

dayjs.extend(businessDays)

После расширения экземпляры Day.js получают дополнительные методы, связанные с календарём рабочих дней.


Базовая логика рабочих дней

Рабочие дни определяются на основе набора правил:

  • стандартные выходные (обычно суббота и воскресенье)
  • пользовательская настройка выходных дней недели
  • исключения (праздники и нерабочие даты)
  • временные календарные диапазоны

Day.js оперирует индексами дней недели:

  • 0 — воскресенье
  • 1 — понедельник
  • 2 — вторник
  • 3 — среда
  • 4 — четверг
  • 5 — пятница
  • 6 — суббота

Проверка рабочего дня

Основной метод определения принадлежности даты к рабочим дням:

dayjs('2026-05-23').isBusinessDay()

Результат:

  • true — дата считается рабочей
  • false — выходной или исключённый день

Метод учитывает текущую конфигурацию выходных, установленную в системе.


Настройка выходных дней недели

В реальных системах рабочие дни редко ограничиваются стандартной моделью «суббота-воскресенье». Day.js позволяет определить собственный набор выходных дней.

dayjs.setBusinessDays([6, 0])

В данном случае:

  • 6 (суббота)
  • 0 (воскресенье)

являются нерабочими днями.

При необходимости модель может быть изменена под локальные правила:

dayjs.setBusinessDays([5, 6]) // пятница и суббота выходные

Добавление рабочих дней

Одна из ключевых операций — смещение даты с учётом только рабочих дней.

dayjs('2026-05-20').businessDaysAdd(5)

Поведение метода:

  • пропускает выходные
  • учитывает конфигурацию бизнес-дней
  • возвращает новый объект Day.js (без мутации исходного)

Пример логики:

  • старт: среда
  • +5 рабочих дней → следующая среда, если выходные суббота и воскресенье

Вычитание рабочих дней

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

dayjs('2026-05-20').businessDaysSubtract(3)

Метод:

  • движется назад по календарю
  • пропускает выходные дни
  • возвращает новый экземпляр даты

Учет нестандартных выходных

В некоторых системах календарь может отличаться от классического:

  • пятница и суббота (в ряде стран)
  • плавающие выходные
  • корпоративные графики 2/2 или 3/3

Настройка:

dayjs.setBusinessDays([4, 5, 6])

Такая конфигурация автоматически влияет на:

  • isBusinessDay()
  • businessDaysAdd()
  • businessDaysSubtract()

Работа с праздничными днями

Базовый механизм Day.js ориентирован на выходные дни недели. Праздничные даты требуют дополнительной логики.

Часто используется комбинированный подход:

const holidays = [
  '2026-01-01',
  '2026-05-09'
]

function isHoliday(date) {
  return holidays.includes(date.format('YYYY-MM-DD'))
}

Интеграция с рабочими днями:

function isWorkingDay(date) {
  return date.isBusinessDay() && !isHoliday(date)
}

Такой подход позволяет расширять календарь без модификации внутренней логики плагина.


Цепочки вычислений с бизнес-днями

Day.js поддерживает цепочки вызовов, что удобно при календарных расчётах:

dayjs('2026-05-01')
  .businessDaysAdd(10)
  .businessDaysSubtract(2)
  .format('YYYY-MM-DD')

Каждый шаг:

  • возвращает новый экземпляр
  • не изменяет исходную дату
  • сохраняет консистентность вычислений

Особенности внутренней модели

Иммутабельность

Все операции с датами создают новый объект. Это исключает побочные эффекты:

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

Зависимость от конфигурации

Результаты вычислений полностью зависят от:

  • списка выходных дней
  • региональных настроек
  • пользовательских правил

Любое изменение конфигурации влияет на уже используемую логику.


Типовые сценарии применения

Расчёт сроков выполнения задач

const deadline = dayjs().businessDaysAdd(7)

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

const deliveryDate = dayjs(orderDate).businessDaysAdd(3)

Обратный отсчёт до события

const start = dayjs(eventDate).businessDaysSubtract(10)

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

if (dayjs(date).isBusinessDay()) {
  // обработка рабочего дня
}

Ограничения модели рабочих дней

При использовании Day.js для бизнес-календарей следует учитывать:

  • отсутствует встроенная база праздников
  • нет автоматической поддержки региональных календарей
  • сложные графики смен требуют дополнительной логики
  • не учитываются частичные рабочие дни (half-day)

Эти ограничения компенсируются внешними слоями бизнес-логики, которые накладываются поверх базового API.


Поведение при изменении временных зон

Day.js оперирует локальными значениями даты. При работе с бизнес-днями важно учитывать:

  • смещение временной зоны может менять календарный день
  • серверные и клиентские расчёты должны использовать единый стандарт
  • при хранении данных предпочтительнее использовать UTC
dayjs.utc('2026-05-20').businessDaysAdd(5)

Композиция с другими плагинами

Модуль бизнес-дней часто используется совместно с:

  • utc — для унификации расчётов
  • timezone — для региональных графиков
  • customParseFormat — для ввода дат из внешних систем

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