Работа с неделями в разных культурах и стандартах не является унифицированной: начало недели, правила нумерации и границы календарных периодов зависят от локали и принятой системы летоисчисления. В JavaScript-библиотеке Date-fns эти различия формализованы через набор функций и параметров локализации, позволяющих корректно обрабатывать недельные интервалы в международных приложениях.
Ключевая проблема локализации недель заключается в трёх аспектах:
Каждый из этих аспектов может изменяться в зависимости от региона и стандарта ISO 8601.
В Date-fns локаль представляет собой объект, содержащий не только названия месяцев и дней, но и правила календаря. Важнейшие параметры недель:
Пример локального объекта:
import { enUS, ru } from 'date-fns/locale'
Внутри локали:
enUS.weekStartsOn = 0ru.weekStartsOn = 1Это определяет поведение всех функций, зависящих от недельных границ.
Функции startOfWeek и endOfWeek являются базовыми инструментами работы с недельными границами.
Функция возвращает дату начала недели с учётом локали или параметра
weekStartsOn.
import { startOfWeek } from 'date-fns'
import { ru } from 'date-fns/locale'
startOfWeek(new Date(2026, 0, 15), { locale: ru })
Логика вычисления:
Функция выполняет обратную операцию:
import { endOfWeek } from 'date-fns'
endOfWeek(new Date(2026, 0, 15), { weekStartsOn: 1 })
Особенность:
ISO 8601 задаёт строгие правила определения недели:
Date-fns реализует ISO-подход через специализированные функции:
import { getISOWeek } from 'date-fns'
getISOWeek(new Date(2026, 0, 1))
import { startOfISOWeek } from 'date-fns'
import { endOfISOWeek } from 'date-fns'
Особенность ISO-недель:
Функция getWeek более гибкая, чем ISO-версия, и учитывает локальные правила.
import { getWeek } from 'date-fns'
import { enUS } from 'date-fns/locale'
getWeek(new Date(2026, 0, 1), { locale: enUS })
Номер недели зависит от:
weekStartsOnfirstWeekContainsDateОпределяет, какой день января должен присутствовать в первой неделе года.
Варианты:
| Параметр | ISO 8601 | Локальная система |
|---|---|---|
| Начало недели | Понедельник | Зависит от локали |
| Первая неделя года | Неделя с 4 января | Может начинаться с 1 января |
| Унификация | Да | Нет |
| Функции Date-fns | getISOWeek | getWeek |
Функция используется для генерации списка недель в интервале.
import { eachWeekOfInterval } from 'date-fns'
eachWeekOfInterval({
start: new Date(2026, 0, 1),
end: new Date(2026, 2, 1)
})
Поведение зависит от:
weekStartsOnКаждый элемент результата — дата начала недели.
Функция изменяет день недели у даты с учётом локали.
import { setDay } from 'date-fns'
setDay(new Date(2026, 0, 15), 0)
Особенность:
weekStartsOn;locale.Date-fns не содержит отдельной функции «форматирования недели», но использует:
formatПримеры токенов:
I — ISO неделя годаw — локальная неделя годаimport { format } from 'date-fns'
format(new Date(2026, 0, 15), 'w')
format(new Date(2026, 0, 15), 'I')
Различие:
w зависит от локали;I следует ISO 8601.Локаль влияет на поведение большинства недельных функций через:
weekStartsOnfirstWeekContainsDateПример различий:
enUS неделя начинается с воскресенья;ru неделя начинается с понедельника;Это влияет на:
При вычислениях часто возникает необходимость строго выровнять даты по недельным границам.
Это обеспечивает корректную работу:
Особенность недельной системы заключается в том, что:
ISO-логика делает это явным:
В локальных системах возможны:
При смешивании ISO и локальных недель возникают расхождения:
Date-fns решает это разделением функций:
Типичные проблемы:
weekStartsOn;getWeek и getISOWeek;locale в параметрах;Наиболее критичная ошибка — использование разных систем нумерации в одном контексте без явного разграничения.