Первый день недели в разных культурах

Модель недели в ISO-8601 и базовая логика js-joda

В основе календарной модели, используемой в современной прикладной разработке, лежит стандарт ISO-8601. В этой системе неделя начинается с понедельника, а завершается воскресеньем. Такое определение закреплено не только формально, но и технически в большинстве библиотек работы с датами, включая js-joda.

В js-joda неделя представлена через перечисление дней:

  • MONDAY
  • TUESDAY
  • WEDNESDAY
  • THURSDAY
  • FRIDAY
  • SATURDAY
  • SUNDAY

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

import { DayOfWeek } from '@js-joda/core'

const day = DayOfWeek.MONDAY

С точки зрения ISO, первый день недели — это всегда понедельник. Однако культурная практика в разных странах не совпадает с этим стандартом, и именно это создаёт необходимость в более гибком инструменте управления неделями.


Культурные модели начала недели

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

Европа и ISO-подход

Большинство европейских стран используют ISO-модель:

  • первый день недели: понедельник
  • последний день: воскресенье

Такой подход удобен для бизнес-процессов, так как обеспечивает единообразие в отчётности, планировании и финансовых системах.

США и Канада

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

  • первый день недели: воскресенье
  • рабочая неделя: понедельник–пятница

Это различие критично при построении интерфейсов календарей и систем планирования, где локализация играет ключевую роль.

Ближний Восток

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

  • рабочая неделя может начинаться в воскресенье
  • выходные: пятница–суббота
Азия

В азиатских странах ситуация неоднородна. Например:

  • Япония и Южная Корея придерживаются ISO-модели (понедельник)
  • в некоторых регионах возможны смешанные системы из-за влияния международного бизнеса

Представление недели в js-joda и ограничение ISO-модели

Библиотека js-joda по умолчанию строго следует ISO-8601. Это означает, что базовые операции с датами не учитывают локальные различия начала недели.

import { LocalDate } from '@js-joda/core'

const date = LocalDate.of(2026, 5, 25)
const dayOfWeek = date.dayOfWeek()

Результат всегда опирается на фиксированную нумерацию:

  • Monday = 1
  • Sunday = 7

Это упрощает арифметику дат, но не решает задачу культурной локализации.


WeekFields и локализация логики недели

Для работы с локальными правилами используется расширение js-joda-extra, предоставляющее механизм WeekFields. Оно позволяет определить:

  • первый день недели
  • минимальное количество дней в первой неделе года
  • правила вычисления недельных полей
import { WeekFields } from '@js-joda/extra'
import { Locale } from '@js-joda/locale'

WeekFields связывается с локалью и позволяет адаптировать календарные вычисления под региональные стандарты.


Определение первого дня недели через Locale

Локаль в js-joda играет ключевую роль при определении календарных правил. Разные локали возвращают разные конфигурации WeekFields.

const wfUS = WeekFields.of(Locale.US)
const wfDE = WeekFields.of(Locale.GERMANY)

В этом примере:

  • Locale.US → воскресенье как первый день недели
  • Locale.GERMANY → понедельник как первый день недели

Использование первого дня недели в вычислениях

WeekFields предоставляет доступ к полям даты, связанным с неделями:

  • dayOfWeek()
  • weekOfWeekBasedYear()
  • weekBasedYear()

Пример извлечения номера дня недели с учётом локали:

import { LocalDate } from '@js-joda/core'
import { WeekFields } from '@js-joda/extra'
import { Locale } from '@js-joda/locale'

const date = LocalDate.of(2026, 5, 25)

const wf = WeekFields.of(Locale.US)

const field = wf.dayOfWeek()
const value = date.get(field)

Здесь значение value будет зависеть от того, какой день считается началом недели в выбранной локали.


Минимальные дни первой недели года

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

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

  • первая неделя года должна содержать 1 января
  • первая неделя года должна содержать минимум 4 дня нового года (ISO-8601)

В js-joda это регулируется через:

const wf = WeekFields.of(Locale.GERMANY)
const minimalDays = wf.minimalDaysInFirstWeek()

Это значение влияет на:

  • вычисление номера недели в году
  • границы перехода между годами
  • календарные отчёты

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

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

Пример:

const date = LocalDate.of(2026, 1, 1)

const wfUS = WeekFields.of(Locale.US)
const wfDE = WeekFields.of(Locale.GERMANY)

const weekUS = date.get(wfUS.weekOfWeekBasedYear())
const weekDE = date.get(wfDE.weekOfWeekBasedYear())

Различия возникают из-за двух факторов:

  • различного первого дня недели
  • различного правила формирования первой недели года

Практическое влияние на календарные системы

Различия в начале недели напрямую влияют на:

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

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


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

При разработке календарных компонентов с js-joda необходимо учитывать, что базовая модель ISO не всегда совпадает с UI-логикой.

Типичный сценарий:

import { DayOfWeek } from '@js-joda/core'

const isoDays = [
  DayOfWeek.MONDAY,
  DayOfWeek.TUESDAY,
  DayOfWeek.WEDNESDAY,
  DayOfWeek.THURSDAY,
  DayOfWeek.FRIDAY,
  DayOfWeek.SATURDAY,
  DayOfWeek.SUNDAY
]

Для локалей с воскресенья первым днём порядок перестраивается:

const usDays = [
  DayOfWeek.SUNDAY,
  DayOfWeek.MONDAY,
  DayOfWeek.TUESDAY,
  DayOfWeek.WEDNESDAY,
  DayOfWeek.THURSDAY,
  DayOfWeek.FRIDAY,
  DayOfWeek.SATURDAY
]

Интернационализация и единая модель данных

При работе с глобальными приложениями используется стратегия разделения:

  • внутреннее хранение дат в ISO-формате
  • отображение через локализованные правила WeekFields

Это позволяет избежать неоднозначностей при:

  • синхронизации сервер–клиент
  • обмене данными между регионами
  • построении отчётности

Сравнение моделей начала недели

Региональная модель Первый день недели Особенность
ISO-8601 Понедельник стандартизированная бизнес-модель
США Воскресенье историко-религиозная традиция
Ближний Восток Суббота/Воскресенье зависит от страны и религии
Большая часть Европы Понедельник совпадает с ISO

Роль DayOfWeek в локализации

DayOfWeek в js-joda остаётся неизменным независимо от локали. Локализация влияет не на сами дни, а на их интерпретацию в контексте недели.

Это принципиальное разделение:

  • DayOfWeek — абсолютная временная единица
  • WeekFields — контекстная интерпретация недели

Такое разделение позволяет:

  • сохранять консистентность данных
  • гибко адаптировать отображение
  • избегать неоднозначностей при расчётах

Вычисление начала недели для произвольной даты

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

import { LocalDate } from '@js-joda/core'
import { WeekFields } from '@js-joda/extra'
import { Locale } from '@js-joda/locale'

const date = LocalDate.of(2026, 5, 25)

const wf = WeekFields.of(Locale.GERMANY)

const startOfWeek = date
  .minusDays(date.get(wf.dayOfWeek()) - 1)

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


Влияние на агрегацию данных

При построении аналитических систем выбор первого дня недели влияет на:

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

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


Связь с бизнес-логикой

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

  • хранение всех расчётов в ISO
  • отображение в локальном формате без изменения данных

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