Проверка выходных: isWeekend

Функция isWeekend из библиотеки date-fns предназначена для определения того, относится ли переданная дата к выходным дням. Под выходными в стандартной конфигурации понимаются суббота и воскресенье. Логика работы функции опирается на календарную неделю и локаль не учитывает — используется фиксированное представление о структуре недели, где суббота и воскресенье имеют определённые индексы.


isWeekend принимает объект даты и возвращает булево значение:

  • true — если дата попадает на субботу или воскресенье
  • false — если дата относится к буднему дню

Сигнатура функции:

isWeekend(date: Date | number): boolean

Функция работает с двумя основными типами входных данных:

  • экземпляр Date
  • числовая метка времени (timestamp в миллисекундах)

Логика определения выходных

Внутренняя логика функции основана на значении дня недели, которое извлекается из даты. В JavaScript неделя традиционно представляется диапазоном от 0 до 6:

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

Выходными считаются значения:

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

Любое другое значение трактуется как будний день.


Простейшее использование

import { isWeekend } from 'date-fns'

isWeekend(new Date(2026, 0, 10)) // суббота → true
isWeekend(new Date(2026, 0, 11)) // воскресенье → true
isWeekend(new Date(2026, 0, 12)) // понедельник → false

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


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

Функция одинаково корректно обрабатывает числовые временные метки:

import { isWeekend } from 'date-fns'

const saturdayTimestamp = new Date(2026, 0, 10).getTime()
const mondayTimestamp = new Date(2026, 0, 12).getTime()

isWeekend(saturdayTimestamp) // true
isWeekend(mondayTimestamp)   // false

Timestamp интерпретируется как количество миллисекунд с Unix-эпохи, после чего преобразуется в дату внутри функции.


Влияние часового пояса

Определение выходного дня зависит от локального времени выполнения. При одинаковом timestamp, но разных часовых поясах, день недели может различаться.

Пример ситуации:

  • UTC время соответствует субботе
  • локальное время может уже быть пятницей или воскресеньем

Это особенно важно при работе с серверными приложениями и распределёнными системами, где данные приходят в UTC.


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

Фильтрация дат

import { isWeekend } from 'date-fns'

const dates = [
  new Date(2026, 0, 9),
  new Date(2026, 0, 10),
  new Date(2026, 0, 11),
  new Date(2026, 0, 12)
]

const weekends = dates.filter(isWeekend)

Результатом будет массив, содержащий только субботу и воскресенье.


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

import { isWeekend } from 'date-fns'

function canProcessTransaction(date) {
  if (isWeekend(date)) {
    return false
  }
  return true
}

Такая логика часто используется в финансовых системах, логистике и расписаниях.


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

import { isWeekend } from 'date-fns'

function getWorkingDays(dates) {
  return dates.filter(date => !isWeekend(date))
}

Функция выделяет рабочие дни из набора дат, что упрощает построение графиков и отчётов.


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

Если переданное значение не является датой или timestamp, результат зависит от преобразования внутри Jav * aScript:

  • Invalid Date приводит к NaN при вычислениях
  • итоговое поведение может быть непредсказуемым

Пример потенциальной проблемы:

isWeekend('not a date') // некорректный ввод

Корректная практика предполагает предварительную валидацию даты.


Работа с датами в виде строк

Строковые представления дат не являются предпочтительным форматом, но JavaScript допускает их преобразование:

import { isWeekend } from 'date-fns'

isWeekend(new Date('2026-01-10')) // true или false в зависимости от дня

Однако парсинг строк зависит от реализации движка и может приводить к различиям в интерпретации формата.


Сравнение с альтернативными подходами

Без использования date-fns аналогичная логика реализуется через стандартный Date:

function isWeekendNative(date) {
  const day = date.getDay()
  return day === 0 || day === 6
}

isWeekend в date-fns по сути инкапсулирует эту проверку, обеспечивая единообразие в рамках библиотеки и согласованность с другими функциями работы с датами.


Интеграция с другими функциями date-fns

isWeekend часто используется совместно с другими утилитами:

С addDays

import { isWeekend, addDays } from 'date-fns'

let date = new Date(2026, 0, 1)

for (let i = 0; i < 10; i++) {
  date = addDays(date, 1)
  if (!isWeekend(date)) {
    // обработка рабочего дня
  }
}

С eachDayOfInterval

import { eachDayOfInterval, isWeekend } from 'date-fns'

const days = eachDayOfInterval({
  start: new Date(2026, 0, 1),
  end: new Date(2026, 0, 31)
})

const weekdays = days.filter(date => !isWeekend(date))

Производственные аспекты использования

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

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


Поведение в различных сценариях календаря

В некоторых бизнес-моделях выходные дни могут отличаться от стандартных (например, пятница и суббота в отдельных странах). В таких случаях isWeekend не подходит напрямую, поскольку фиксирует западную модель недели. Для альтернативных календарей требуется дополнительная логика поверх функции.

Пример адаптации:

import { isWeekend } from 'date-fns'

function isCustomWeekend(date) {
  const day = date.getDay()
  return day === 5 || day === 6 // пятница и суббота
}

Роль в построении временных алгоритмов

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

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

Функция обеспечивает атомарную проверку, которая часто комбинируется с более сложной бизнес-логикой.