В основе календарной модели, используемой в современной прикладной разработке, лежит стандарт ISO-8601. В этой системе неделя начинается с понедельника, а завершается воскресеньем. Такое определение закреплено не только формально, но и технически в большинстве библиотек работы с датами, включая js-joda.
В js-joda неделя представлена через перечисление дней:
Каждый день недели является неизменяемым объектом типа
DayOfWeek, что соответствует философии библиотеки: работа с
датами строится на иммутабельных значениях.
import { DayOfWeek } from '@js-joda/core'
const day = DayOfWeek.MONDAY
С точки зрения ISO, первый день недели — это всегда понедельник. Однако культурная практика в разных странах не совпадает с этим стандартом, и именно это создаёт необходимость в более гибком инструменте управления неделями.
Разные регионы мира исторически сформировали собственные представления о начале недели. Эти различия закреплены в локальных календарных традициях, трудовых практиках и религиозных нормах.
Большинство европейских стран используют ISO-модель:
Такой подход удобен для бизнес-процессов, так как обеспечивает единообразие в отчётности, планировании и финансовых системах.
В североамериканской традиции неделя начинается с воскресенья. Это историческое наследие религиозного календаря, где воскресенье рассматривалось как первый день творения и одновременно день отдыха.
Это различие критично при построении интерфейсов календарей и систем планирования, где локализация играет ключевую роль.
Во многих странах Ближнего Востока неделя начинается с субботы или воскресенья в зависимости от религиозной и административной системы. В странах, где пятница является священным днём, структура недели смещается:
В азиатских странах ситуация неоднородна. Например:
Библиотека js-joda по умолчанию строго следует ISO-8601. Это означает, что базовые операции с датами не учитывают локальные различия начала недели.
import { LocalDate } from '@js-joda/core'
const date = LocalDate.of(2026, 5, 25)
const dayOfWeek = date.dayOfWeek()
Результат всегда опирается на фиксированную нумерацию:
Это упрощает арифметику дат, но не решает задачу культурной локализации.
Для работы с локальными правилами используется расширение
js-joda-extra, предоставляющее механизм WeekFields. Оно
позволяет определить:
import { WeekFields } from '@js-joda/extra'
import { Locale } from '@js-joda/locale'
WeekFields связывается с локалью и позволяет
адаптировать календарные вычисления под региональные стандарты.
Локаль в js-joda играет ключевую роль при определении календарных
правил. Разные локали возвращают разные конфигурации
WeekFields.
const wfUS = WeekFields.of(Locale.US)
const wfDE = WeekFields.of(Locale.GERMANY)
В этом примере:
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.US)
const field = wf.dayOfWeek()
const value = date.get(field)
Здесь значение value будет зависеть от того, какой день
считается началом недели в выбранной локали.
Помимо первого дня недели, важным параметром является количество дней, необходимых для формирования первой недели года.
В разных системах встречаются два основных подхода:
В 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-8601 | Понедельник | стандартизированная бизнес-модель |
| США | Воскресенье | историко-религиозная традиция |
| Ближний Восток | Суббота/Воскресенье | зависит от страны и религии |
| Большая часть Европы | Понедельник | совпадает с ISO |
DayOfWeek в js-joda остаётся неизменным независимо от
локали. Локализация влияет не на сами дни, а на их интерпретацию в
контексте недели.
Это принципиальное разделение:
Такое разделение позволяет:
Используя комбинацию 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)
Результат зависит от локального определения начала недели, что позволяет корректно строить календарные диапазоны.
При построении аналитических систем выбор первого дня недели влияет на:
Например, недельный отчёт может сдвигаться на один день при смене локали, что приводит к различию в статистике при одинаковых исходных данных.
В корпоративных системах часто требуется фиксированная модель недели независимо от локали пользователя. В таких случаях применяется стратегия:
js-joda позволяет поддерживать такую архитектуру благодаря строгому разделению временных сущностей и контекстов вычисления.