Номер недели — это числовая характеристика даты, определяющая её положение в рамках календарного года. В большинстве систем отсчёта неделя рассматривается как непрерывный блок из семи дней, однако правила определения первой недели года и начала недели зависят от выбранного стандарта.
В JavaScript при работе с датами базовый объект Date не
предоставляет встроенного универсального метода для вычисления номера
недели. Библиотека Day.js решает эту задачу через систему подключаемых
плагинов, позволяя гибко выбирать правила расчёта.
В Day.js вычисление номера недели реализуется не в ядре библиотеки, а через расширения:
weekOfYear — классическое определение недели года с
учётом локалиisoWeek — стандарт ISO 8601Такой подход позволяет не перегружать ядро и одновременно поддерживать разные стандарты календарей.
Перед использованием функционала недель необходимо подключить соответствующие расширения.
import dayjs from 'dayjs'
import weekOfYear from 'dayjs/plugin/weekOfYear'
import isoWeek from 'dayjs/plugin/isoWeek'
dayjs.extend(weekOfYear)
dayjs.extend(isoWeek)
После подключения Day.js получает дополнительные методы:
week() — номер недели (зависит от локали и
плагина)isoWeek() — номер недели по ISO 8601ISO 8601 определяет строгие правила вычисления недель:
В Day.js этот стандарт реализуется через метод
isoWeek().
dayjs('2026-01-01').isoWeek()
Метод возвращает номер ISO-недели независимо от локальных настроек.
Дополнительно доступны:
dayjs().startOf('isoWeek')
dayjs().endOf('isoWeek')
Эти методы позволяют получать границы недели по ISO-правилам, что критично при построении календарных интерфейсов и аналитики.
Плагин weekOfYear использует локализацию для определения
начала недели и первой недели года.
import 'dayjs/locale/ru'
dayjs.locale('ru')
В зависимости от локали меняется:
Метод:
dayjs('2026-01-01').week()
возвращает номер недели согласно локальным настройкам.
Ключевое различие заключается в источнике правил:
| Метод | Стандарт | Зависимость от локали |
|---|---|---|
| week() | локальный | да |
| isoWeek() | ISO 8601 | нет |
Это различие критично при обработке данных из разных регионов, где календарные стандарты отличаются.
Day.js позволяет не только получать, но и изменять неделю.
dayjs('2026-05-22').isoWeek()
dayjs('2026-05-22').week()
dayjs().isoWeek(10)
dayjs().week(3)
При установке дата смещается таким образом, чтобы соответствовать указанной неделе текущего года.
Работа с границами недели часто используется в отчётности и фильтрации данных.
dayjs().startOf('isoWeek')
dayjs().endOf('isoWeek')
dayjs().startOf('week')
dayjs().endOf('week')
Результат зависит от локали и может отличаться между системами.
При построении календаря месяца используется вычисление смещения относительно первой недели:
const firstDay = dayjs('2026-01-01')
const weekIndex = firstDay.isoWeek()
const grouped = {}
data.forEach(item => {
const week = dayjs(item.date).isoWeek()
if (!grouped[week]) {
grouped[week] = []
}
grouped[week].push(item)
})
При агрегации метрик:
const stats = new Map()
for (const row of rows) {
const key = dayjs(row.timestamp).isoWeek()
stats.set(key, (stats.get(key) || 0) + row.value)
}
Особое внимание требуется при переходе между годами. ISO-неделя может относиться к предыдущему или следующему году, даже если дата находится в январе или декабре.
dayjs('2025-12-31').isoWeek()
dayjs('2026-01-01').isoWeek()
Такие случаи важны при построении годовых отчётов, где простая
проверка year() недостаточна.
Локаль влияет на интерпретацию:
Это напрямую отражается на результатах week():
dayjs.locale('en')
dayjs().week()
dayjs.locale('ru')
dayjs().week()
Разница может приводить к изменению номера недели для одной и той же даты.
Day.js позволяет комбинировать недели с другими методами:
dayjs().startOf('isoWeek').add(2, 'day')
dayjs().subtract(1, 'week').isoWeek()
Такие конструкции применяются для построения диапазонов и навигации по календарю.
При сохранении номера недели в базе данных важно учитывать:
Пример структуры:
{
"year": 2026,
"isoWeek": 21
}
Без хранения года номер недели теряет однозначность.
Обратное преобразование недели в дату:
dayjs().year(2026).isoWeek(10).startOf('isoWeek')
Этот подход используется для генерации расписаний и планирования.
Формирование диапазона:
const start = dayjs().isoWeek(5).startOf('isoWeek')
const end = dayjs().isoWeek(5).endOf('isoWeek')
Диапазон используется в фильтрации данных и отчётных системах.
Хотя номер недели не зависит напрямую от часового пояса, границы
недели могут смещаться при переходе DST, особенно при использовании
startOf('week') в локальных системах.
Некоторые локали могут иметь различия:
Day.js учитывает эти параметры через систему локалей, что делает поведение предсказуемым при правильной настройке.
Номер недели часто используется вместе с форматированием:
dayjs().format('YYYY [week] W')
dayjs().format('GGGG-[W]WW')
Второй вариант соответствует ISO-формату года и недели.