Праздники и нерабочие дни

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

Основой работы с датами в международном контексте выступает объект Intl.DateTimeFormat. Он не определяет праздники, но задаёт правила отображения дат, которые зависят от локали: порядок компонентов, названия месяцев, дней недели и формат календаря.

const formatter = new Intl.DateTimeFormat("ru-RU", {
  weekday: "long",
  year: "numeric",
  month: "long",
  day: "numeric"
});

formatter.format(new Date());

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

Недельная структура и выходные дни

Одним из ключевых элементов, связанных с нерабочими днями, является информация о структуре недели. Она доступна через Intl.Locale, который предоставляет данные о культурных параметрах региона.

const locale = new Intl.Locale("ar-EG");

locale.weekInfo;

weekInfo содержит сведения о:

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

Пример структуры:

{
  firstDay: 6,
  weekend: [5, 6],
  minimalDays: 1
}

Эти данные позволяют вычислять стандартные выходные дни для конкретной локали без жестко заданных правил в коде.

Интерпретация выходных через культурные нормы

Выходные дни зависят от региона и религиозных традиций. Например:

  • в большинстве европейских локалей выходные — суббота и воскресенье
  • в некоторых странах Ближнего Востока — пятница и суббота
  • в отдельных регионах возможны гибридные схемы

Intl.Locale.weekInfo отражает именно эти различия, предоставляя программную основу для определения нерабочих дней без внешних таблиц.

const locale = new Intl.Locale("en-US");

console.log(locale.weekInfo.weekend); // [6, 0]

Значения дней недели кодируются от 0 (воскресенье) до 6 (суббота).

Форматирование дат с учётом локали

Хотя Intl не содержит информации о праздниках, он обеспечивает корректное отображение дат, что критично для систем календарей.

const formatter = new Intl.DateTimeFormat("ja-JP", {
  year: "numeric",
  month: "2-digit",
  day: "2-digit"
});

Разные локали могут использовать различные календари:

  • григорианский
  • японский императорский
  • исламский
  • буддийский

Это влияет на отображение дат, включая праздничные циклы.

Календарные системы и их влияние на праздничные циклы

С помощью Intl.supportedValuesOf можно получить список доступных календарей:

Intl.supportedValuesOf("calendar");

Календарная система определяет структуру года, месяцев и иногда способ вычисления праздничных дат. Например:

  • исламский календарь основан на лунных циклах
  • григорианский — на солнечном году
  • японский — сочетает эры и солнечный календарь

Праздники в таких системах могут быть плавающими относительно григорианских дат.

Вычисление нерабочих дней на основе локали

Комбинация Intl.DateTimeFormat и Intl.Locale.weekInfo позволяет строить базовую модель выходных дней.

const locale = new Intl.Locale("fr-FR");
const weekend = locale.weekInfo.weekend;

function isWeekend(date, locale) {
  const day = date.getDay();
  return locale.weekInfo.weekend.includes(day);
}

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

Ограничения Intl в области праздников

Intl не содержит:

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

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

Интеграция локальных правил с внешними календарями

Для полноценного учёта нерабочих дней используется сочетание:

  • Intl.Locale для определения структуры недели
  • Intl.DateTimeFormat для отображения дат
  • внешних календарных источников для праздников

Такая архитектура позволяет отделить:

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

Практическое значение культурных параметров

Информация о выходных через weekInfo используется в задачах:

  • планирование рабочих графиков
  • расчёт сроков доставки
  • построение календарей бронирования
  • анализ рабочих нагрузок
function isWorkingDay(date, locale) {
  return !locale.weekInfo.weekend.includes(date.getDay());
}

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

Многообразие локалей и влияние на календарные системы

Каждая локаль может иметь собственные правила:

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

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