В Day.js неделя не является фиксированным интервалом, жёстко
привязанным к конкретному дню календаря. Определение первого дня недели
зависит от текущей локали и её параметра weekStart. Это
означает, что одинаковые операции над датами могут давать разные
результаты в зависимости от языковой или региональной настройки
окружения.
Ключевой момент: startOf('week') вычисляется
относительно локали, а не универсального стандарта
dayjs().startOf('week')
Поведение этого выражения напрямую зависит от того, какой день считается началом недели в активной локали.
Каждая локаль в Day.js может содержать поле weekStart,
определяющее индекс первого дня недели:
0 — воскресенье1 — понедельник2 — вторник6 — субботаНапример:
import dayjs from 'dayjs'
import 'dayjs/locale/ru'
dayjs.locale('ru')
В локали ru начало недели соответствует понедельнику
(weekStart: 1), поэтому:
dayjs().startOf('week')
вернёт понедельник текущей недели.
В английской локали en (по умолчанию):
dayjs.locale('en')
weekStart равен 0, и неделя начинается с
воскресенья.
Метод startOf('week') приводит дату к началу недели,
учитывая локаль:
dayjs('2026-05-22').startOf('week')
Результат будет различаться:
weekStart = 0 → воскресенье 17 мая 2026weekStart = 1 → понедельник 18 мая 2026Это поведение критично для:
В Day.js локаль можно переопределить, задав собственный
weekStart.
import dayjs from 'dayjs'
dayjs.locale({
name: 'custom-ru',
weekStart: 1,
weekdays: [
'понедельник',
'вторник',
'среда',
'четверг',
'пятница',
'суббота',
'воскресенье'
],
months: []
}, null, true)
После активации:
dayjs.locale('custom-ru')
Все операции с неделями начинают использовать новую конфигурацию.
Day.js использует глобальное состояние локали, поэтому:
dayjs.locale('ru')
меняет поведение всех последующих вызовов
startOf('week').
Однако можно временно переключать локаль:
dayjs().locale('en').startOf('week')
dayjs().locale('ru').startOf('week')
В этом случае глобальная локаль не изменяется, и влияние ограничивается конкретной операцией.
Логика симметрична и для конца недели:
dayjs().endOf('week')
Этот метод возвращает последний момент недели (23:59:59.999), и также
зависит от weekStart.
Если неделя начинается в понедельник, то конец недели приходится на воскресенье.
Для корректной работы недельных расчётов часто используется плагин
weekOfYear:
import weekOfYear from 'dayjs/plugin/weekOfYear'
dayjs.extend(weekOfYear)
Он также опирается на локаль:
dayjs('2026-01-01').week()
Результат номера недели зависит от того, какой день считается началом недели, так как границы недель смещаются.
При построении систем аналитики и отчётности важно учитывать:
Типичный пример ошибки:
const start = dayjs(date).startOf('week')
const end = dayjs(date).endOf('week')
Если сервер использует en, а клиент ru,
диапазоны недель будут различаться, что приводит к несогласованным
отчётам.
Для устранения неоднозначности часто фиксируют локаль независимо от пользовательских настроек:
dayjs.locale('en') // фиксированное воскресенье как начало недели
или
dayjs.locale('ru') // фиксированный понедельник
Такой подход делает вычисления детерминированными.
При необходимости игнорировать локали можно явно вычислять начало недели:
const startOfWeek = (date, start = 1) => {
const d = dayjs(date)
const day = d.day()
const diff = (day < start ? 7 : 0) + day - start
return d.subtract(diff, 'day').startOf('day')
}
Такой метод полностью отключает зависимость от локали Day.js и задаёт бизнес-логику явно.
Метод day() возвращает индекс дня недели:
dayjs().day()
Он не зависит от weekStart, что важно при сравнении с
startOf('week'), так как:
day() — фиксированная шкалаstartOf('week') — локализованная логикаОсобенно сильное влияние настройки начала недели проявляется в задачах:
Во всех этих случаях ошибка в weekStart приводит к
смещению границ данных на 1–2 дня, что искажает агрегированные
результаты.