Номер недели в году — это способ разбиения календарного времени на последовательные семидневные интервалы, начиная с фиксированной точки отсчёта. В разных стандартах эта точка отличается: неделя может начинаться с воскресенья или понедельника, а первая неделя года может определяться по-разному.
В практических задачах, связанных с аналитикой, логированием, планированием и отчётами, чаще всего используется ISO-8601 стандарт, где неделя начинается с понедельника, а первая неделя года — та, которая содержит первый четверг января.
В контексте JavaScript удобную работу с датами и неделями обеспечивает библиотека Day.js, которая предоставляет компактный API и расширяется через плагины.
По умолчанию Day.js не включает вычисление номера недели. Это сделано намеренно: функциональность подключается только при необходимости через плагины, чтобы не увеличивать размер сборки.
Основной принцип работы:
Для получения номера недели по простому календарному принципу
используется плагин weekOfYear.
Подключение:
import dayjs from 'dayjs'
import weekOfYear from 'dayjs/plugin/weekOfYear'
dayjs.extend(weekOfYear)
После подключения появляется метод:
dayjs().week()
Плагин weekOfYear использует локально-зависимую модель
недели:
Пример:
dayjs('2026-01-01').week()
dayjs('2026-06-15').week()
Такой подход удобен для интерфейсов, где требуется «человеческое» представление календаря, например в UI расписаний.
Для строгих календарных вычислений используется ISO-8601. В Day.js
это реализуется через плагин isoWeek.
Подключение:
import isoWeek from 'dayjs/plugin/isoWeek'
dayjs.extend(isoWeek)
После подключения становятся доступны методы:
dayjs().isoWeek()
dayjs().isoWeekYear()
dayjs().startOf('isoWeek')
dayjs().endOf('isoWeek')
ISO-нумерация имеет жёсткие правила:
Это приводит к важным отличиям от обычной календарной логики.
Различие между подходами принципиальное:
dayjs().isoWeek()
dayjs('2026-03-10').isoWeek()
dayjs('2026-03-10').startOf('isoWeek')
Результатом будет понедельник соответствующей ISO-недели.
ISO-недели тесно связаны с понятием «года недели»:
dayjs('2026-01-01').isoWeekYear()
Иногда дата января может принадлежать последней неделе предыдущего года, что важно учитывать при группировке данных.
Пример пограничной логики:
Номер недели используется для:
Пример группировки:
const week = dayjs(date).isoWeek()
const year = dayjs(date).isoWeekYear()
const key = `${year}-W${week}`
Такой ключ позволяет корректно агрегировать данные без ошибок при переходе года.
При использовании weekOfYear важную роль играет
локаль:
import 'dayjs/locale/ru'
dayjs.locale('ru')
В разных локалях:
ISO-стандарт при этом остаётся неизменным независимо от локали.
Типичные проблемы:
weekOfYear и isoWeekweek() без понимания контекстаОсобенно критична ошибка смешивания стандартов в аналитических системах, где это приводит к некорректным отчётам за периоды.
Номер недели часто используется совместно с:
startOf('day') — нормализация датadd() и subtract() — переход по
неделямformat() — вывод в отчётахdiff() — вычисление разницы между датамиПример перехода между неделями:
dayjs().add(1, 'week').isoWeek()
Для построения временных рядов часто используется схема:
const grouped = {}
data.forEach(item => {
const d = dayjs(item.date)
const key = `${d.isoWeekYear()}-${d.isoWeek()}`
if (!grouped[key]) grouped[key] = []
grouped[key].push(item)
})
Такая структура обеспечивает устойчивую агрегацию данных по календарным неделям независимо от границ месяцев и годов.