ISO-нумерация дней недели основана на стандарте ISO 8601, где неделя начинается с понедельника, а дни получают значения от 1 до 7. Понедельник соответствует 1, вторник — 2, и так далее до воскресенья, которое имеет значение 7. Такой подход отличается от привычной нумерации в JavaScript и многих локалях, где неделя часто начинается с воскресенья (0) или понедельника (1, но с иной семантикой).
В библиотеке Day.js работа с ISO-днями недели реализуется через плагин isoWeek и метод isoWeekday(), который предоставляет согласованное поведение с ISO 8601 и устраняет неоднозначности локальных календарных настроек.
Стандартный объект Date в JavaScript использует
метод:
new Date().getDay()
который возвращает значения от 0 до 6:
Такой подход исторически связан с американской локализацией, где неделя начинается с воскресенья. Однако в ISO-стандарте неделя начинается с понедельника, и это приводит к постоянной необходимости преобразований при работе с датами в международных системах.
ISO 8601 определяет строгую модель:
В контексте дней недели важна именно линейная шкала:
| День | ISO-значение |
|---|---|
| Понедельник | 1 |
| Вторник | 2 |
| Среда | 3 |
| Четверг | 4 |
| Пятница | 5 |
| Суббота | 6 |
| Воскресенье | 7 |
Day.js реализует эту модель через дополнительный API поверх базового ядра.
Для работы с ISO-нумерацией необходимо подключить плагин:
import dayjs from 'dayjs'
import isoWeek from 'dayjs/plugin/isoWeek'
dayjs.extend(isoWeek)
После расширения API появляется метод isoWeekday() и
набор функций, связанных с ISO-неделями.
Основной метод работы:
dayjs().isoWeekday()
Он возвращает число от 1 до 7 в соответствии с ISO-стандартом.
Пример:
import dayjs from 'dayjs'
import isoWeek from 'dayjs/plugin/isoWeek'
dayjs.extend(isoWeek)
const d = dayjs('2026-05-22')
console.log(d.isoWeekday())
Результат будет интерпретирован как день недели по ISO-системе.
Метод isoWeekday() работает не только как геттер, но и
как сеттер:
dayjs().isoWeekday(1)
Это устанавливает дату на ближайший понедельник текущей недели.
Пример изменения дня:
const date = dayjs('2026-05-22')
// перенос на понедельник той же недели
const monday = date.isoWeekday(1)
// перенос на воскресенье
const sunday = date.isoWeekday(7)
Важно: изменение происходит относительно текущей календарной недели, а не абсолютной даты.
Day.js также предоставляет метод weekday(), который
приходит из другого плагина — weekday.
Подключение:
import weekday from 'dayjs/plugin/weekday'
dayjs.extend(weekday)
weekday() зависит от локали и настройки начала
неделиisoWeekday() всегда строго следует ISO 8601dayjs().weekday()
Значение может интерпретироваться по-разному в зависимости от локали:
Это делает weekday() чувствительным к окружению.
dayjs().isoWeekday()
Всегда фиксированная модель:
Нет зависимости от локали или пользовательских настроек.
const a = dayjs('2026-05-20')
const b = dayjs('2026-05-22')
if (a.isoWeekday() < b.isoWeekday()) {
// a раньше в рамках недели
}
const date = dayjs('2026-05-22')
const monday = date.isoWeekday(1)
const sunday = date.isoWeekday(7)
Этот подход позволяет быстро вычислить границы недели без ручных
вычислений через add и subtract.
function getIsoWeekRange(date) {
const d = dayjs(date)
return {
start: d.isoWeekday(1),
end: d.isoWeekday(7)
}
}
Результат всегда соответствует ISO-неделе независимо от входной даты.
При установке значения вне диапазона 1–7 Day.js нормализует результат, переходя в соседние недели:
dayjs().isoWeekday(8) // следующий понедельник
dayjs().isoWeekday(0) // предыдущая неделя воскресенье
Такая логика позволяет удобно перемещаться по календарю без явного добавления недель.
Плагин isoWeek дополняет isoWeekday()
методами работы с номером недели:
dayjs.extend(isoWeek)
dayjs().isoWeek() // номер ISO-недели
dayjs().isoWeekYear() // ISO-год
Это важно в задачах, где требуется строгая календарная идентичность:
Комбинация isoWeekday() с арифметикой дат:
const base = dayjs('2026-05-22')
const nextTuesday = base.isoWeekday(2).add(1, 'week')
Такой подход фиксирует день недели и перемещает его по временной оси.
// некорректно для ISO-логики
const day = new Date().getDay()
Это приводит к смещению логики недели и необходимости дополнительных преобразований.
Метод weekday() может вести себя по-разному в
зависимости от конфигурации окружения, что делает его ненадёжным для
систем, где важна строгая календарная согласованность.
Установка дня недели не меняет смысл даты как календарного объекта:
dayjs('2026-05-22').isoWeekday(1)
Результат — дата из той же недели, а не «абсолютный понедельник».
Day.js опирается на immutable-архитектуру:
isoWeekday() возвращает новый объектconst d = dayjs('2026-05-22')
const updated = d.isoWeekday(1)
console.log(d.format())
console.log(updated.format())
ISO-дни недели применяются при построении UI-компонентов:
Типовой алгоритм формирования недели:
function buildWeek(date) {
const start = dayjs(date).isoWeekday(1)
return Array.from({ length: 7 }).map((_, i) =>
start.add(i, 'day')
)
}
Такой подход гарантирует стабильный порядок дней независимо от входной даты.
ISO-логика критична в интеграциях:
Day.js через isoWeekday() обеспечивает единый стандарт
интерпретации дней недели без привязки к региональным настройкам среды
выполнения.