В календарной системе год определяется фиксированным диапазоном с 1 января по 31 декабря. Однако при работе с неделями возникает дополнительное понятие — год недели, который может отличаться от календарного года.
Год недели используется в стандарте ISO 8601 и определяется не по границам календаря, а по расположению недели:
Из-за этого даты в начале января могут относиться к последней неделе предыдущего года, а даты конца декабря — к первой неделе следующего.
Пример типичной ситуации:
Это делает использование обычного year() некорректным
при работе с недельной нумерацией.
ISO week year — это год, определяемый через структуру недель, а не через календарные границы.
Он тесно связан с:
В Day.js для работы с этим понятием используется плагин
isoWeekYear.
Функция получения года недели не входит в базовую сборку Day.js и требует подключения плагина:
import dayjs from 'dayjs'
import isoWeek from 'dayjs/plugin/isoWeek'
import isoWeekYear from 'dayjs/plugin/isoWeekYear'
dayjs.extend(isoWeek)
dayjs.extend(isoWeekYear)
Плагин isoWeek необходим для корректной работы недельной
логики, включая начало недели и номер недели.
Основной метод для получения ISO week year:
dayjs().isoWeekYear()
Метод возвращает числовое значение года, соответствующего ISO-неделе текущей даты.
Пример:
dayjs('2026-01-01').isoWeekYear()
Результат может быть:
2025
Несмотря на то, что календарно дата находится в 2026 году, она относится к последней ISO-неделе 2025 года.
Разница между двумя методами становится заметной на границах года:
dayjs('2025-12-31').year() // 2025
dayjs('2025-12-31').isoWeekYear() // 2026
Здесь:
year() возвращает календарный год;isoWeekYear() возвращает год, соответствующий недельной
системе.Такое расхождение критично для:
Часто год недели используется совместно с номером недели:
const d = dayjs('2026-01-01')
const weekYear = d.isoWeekYear()
const weekNumber = d.isoWeek()
console.log(weekYear, weekNumber)
Результат может выглядеть так:
2025 53
Это означает, что дата относится к 53-й неделе 2025 ISO-года.
Год недели часто применяется для создания ключей группировки данных:
function getWeekKey(date) {
const d = dayjs(date)
return `${d.isoWeekYear()}-W${String(d.isoWeek()).padStart(2, '0')}`
}
Пример результата:
2025-W53
2026-W01
Такой формат используется в:
Особенность ISO-нумерации проявляется в том, что год может начинаться не с 1 января.
Если 1 января попадает в конец предыдущего недельного цикла, то:
Аналогично:
Day.js позволяет комбинировать ISO week year с форматированием строк:
dayjs('2026-01-01').format('GGGG-[W]WW')
Где:
GGGG — ISO week year;WW — номер недели;W — префикс недели.Результат:
2025-W53
dayjs(date).year()
Ошибка приводит к некорректной группировке данных на границах года.
Без подключения плагина:
Комбинация:
year() + isoWeek()isoWeekYear() + month()может приводить к логическим несоответствиям при агрегации данных.
Год недели используется для построения устойчивых временных рядов:
Пример группировки:
const grouped = {}
data.forEach(item => {
const d = dayjs(item.date)
const key = `${d.isoWeekYear()}-W${d.isoWeek()}`
if (!grouped[key]) grouped[key] = []
grouped[key].push(item)
})
Такой подход гарантирует корректную агрегацию независимо от календарных переходов.
Использование isoWeekYear() обеспечивает полное
соответствие стандарту ISO 8601, где:
Это делает подход предпочтительным в системах, где важна точность периодизации по неделям.