Получение года для недели

Различие между календарным годом и годом недели

В календарной системе год определяется фиксированным диапазоном с 1 января по 31 декабря. Однако при работе с неделями возникает дополнительное понятие — год недели, который может отличаться от календарного года.

Год недели используется в стандарте ISO 8601 и определяется не по границам календаря, а по расположению недели:

  • первая неделя года — это неделя, содержащая первый четверг января;
  • недели начинаются с понедельника;
  • каждая неделя принадлежит тому году, к которому относится её четверг.

Из-за этого даты в начале января могут относиться к последней неделе предыдущего года, а даты конца декабря — к первой неделе следующего.

Пример типичной ситуации:

  • 1 января может попасть в последнюю ISO-неделю предыдущего года;
  • 31 декабря может относиться к первой ISO-неделе следующего года.

Это делает использование обычного year() некорректным при работе с недельной нумерацией.


Понятие ISO week year

ISO week year — это год, определяемый через структуру недель, а не через календарные границы.

Он тесно связан с:

  • номером недели в году;
  • правилом ISO о первой неделе;
  • фиксированным недельным календарём (понедельник — начало недели).

В Day.js для работы с этим понятием используется плагин isoWeekYear.


Подключение функциональности week year

Функция получения года недели не входит в базовую сборку 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 года.


Сравнение year() и isoWeekYear()

Разница между двумя методами становится заметной на границах года:

dayjs('2025-12-31').year()         // 2025
dayjs('2025-12-31').isoWeekYear()  // 2026

Здесь:

  • year() возвращает календарный год;
  • isoWeekYear() возвращает год, соответствующий недельной системе.

Такое расхождение критично для:

  • отчётности по неделям;
  • аналитики продаж;
  • финансовых периодов;
  • планирования по ISO-неделям.

Получение года недели вместе с номером недели

Часто год недели используется совместно с номером недели:

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 января попадает в конец предыдущего недельного цикла, то:

  • неделя принадлежит предыдущему ISO году;
  • первый ISO-день года может начинаться позже (например, 2–4 января).

Аналогично:

  • последние дни декабря могут относиться к следующему ISO году, если они входят в первую неделю следующего цикла.

Использование с форматированием

Day.js позволяет комбинировать ISO week year с форматированием строк:

dayjs('2026-01-01').format('GGGG-[W]WW')

Где:

  • GGGG — ISO week year;
  • WW — номер недели;
  • W — префикс недели.

Результат:

2025-W53

Типичные ошибки при работе с годом недели

Использование year() вместо isoWeekYear()

dayjs(date).year()

Ошибка приводит к некорректной группировке данных на границах года.


Игнорирование плагина isoWeek

Без подключения плагина:

  • методы ISO-недель недоступны;
  • расчёты недель могут работать некорректно или отсутствовать.

Смешивание календарных и ISO-значений

Комбинация:

  • 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)
})

Такой подход гарантирует корректную агрегацию независимо от календарных переходов.


Согласованность с ISO 8601

Использование isoWeekYear() обеспечивает полное соответствие стандарту ISO 8601, где:

  • недели строго определены;
  • год привязан к недельной структуре;
  • временные интервалы стабильны при анализе данных.

Это делает подход предпочтительным в системах, где важна точность периодизации по неделям.