Токены для недели года

В Moment.js работа с неделями года основана на двух взаимосвязанных концепциях: номер недели и год недели (week year). Эти понятия отличаются от привычного календарного года, поскольку границы недели могут «перетягивать» даты на соседний год.


Номер недели года

Moment.js поддерживает несколько токенов для отображения номера недели в зависимости от локали или стандарта ISO.

Локальная неделя года

Локальная система недель зависит от настроек регионального формата (например, первый день недели и правило первой недели года).

  • w — номер недели года (без ведущего нуля)
  • ww — номер недели года с ведущим нулём (двухзначный формат)
  • wo — порядковый номер недели (с суффиксом, например “1st”, “2nd” в английской локали)

Примеры:

  • w: 3
  • ww: 03
  • wo: 3rd

Особенность локальной недели заключается в том, что начало недели и правила первой недели года могут отличаться. В некоторых локалях неделя начинается в воскресенье, в других — в понедельник.


ISO-неделя года

ISO 8601 определяет строгий стандарт недель:

  • неделя начинается в понедельник
  • первая неделя года — та, которая содержит первый четверг января

Для ISO-недель используются следующие токены:

  • W — номер ISO-недели (без ведущего нуля)
  • WW — номер ISO-недели (с ведущим нулём)

Примеры:

  • W: 7
  • WW: 07

ISO-недели часто используются в корпоративных системах, аналитике и логистике, где требуется строгая согласованность календарных периодов.


Год недели (Week Year)

Год недели — это отдельная система, отличная от календарного года (YYYY). Он привязан не к 1 января, а к логике недель.

Локальный год недели

  • gg — двухзначный локальный год недели
  • gggg — четырёхзначный локальный год недели

Примеры:

  • gg: 24
  • gggg: 2024

Локальный год недели может начинаться в конце декабря предыдущего календарного года, если первая неделя включает дни нового года.


ISO год недели

ISO-год недели используется вместе с ISO-неделями и является наиболее строгой системой недельного календаря.

  • GG — двухзначный ISO год недели
  • GGGG — четырёхзначный ISO год недели

Примеры:

  • GG: 24
  • GGGG: 2024

Взаимосвязь недели и года недели

Наиболее важная особенность Moment.js заключается в том, что неделя и год недели всегда связаны между собой. Нельзя корректно использовать W или w без соответствующего GGGG или gggg, если требуется точная идентификация периода.

Пример форматов

  • gggg-[W]W → локальный год недели + номер недели
  • GGGG-[W]WW → ISO год недели + ISO неделя

Проблема перехода года

При переходе между декабрём и январём возникает ключевая особенность:

  • 29–31 декабря могут относиться к первой неделе следующего года недели
  • 1–3 января могут относиться к последней неделе предыдущего года недели

Это приводит к различию между:

  • календарным годом (YYYY)
  • годом недели (GGGG или gggg)

Пример расхождения

Дата: 2025-01-01

  • YYYY: 2025
  • GGGG: может быть 2024 (если дата попадает в последнюю ISO-неделю 2024 года)

Практические шаблоны форматирования

ISO-формат недели

GGGG-[W]WW

Вывод:

2024-W05

Локальный формат недели

gggg-[w]ww

Вывод:

2024-w05

Полная идентификация периода

GGGG-[W]WW (dddd)

Вывод:

2024-W05 (Monday)

Частые ошибки при использовании токенов

Использование YYYY вместо GGGG

YYYY не учитывает правила ISO-недели, что приводит к некорректной группировке данных по неделям.

Смешивание w и W

  • w — локальная неделя
  • W — ISO-неделя

Их нельзя считать эквивалентными, особенно в аналитических системах.


Несогласованность с годом недели

Использование:

YYYY-WW

является логически некорректным, поскольку календарный год и ISO-неделя могут принадлежать разным периодам.


Поведение Moment.js при вычислении недель

Moment.js рассчитывает номер недели на основе внутренних правил:

  • первый день недели зависит от локали (locale)
  • первая неделя года определяется по ISO или локальному стандарту
  • границы года недели могут выходить за пределы календарного года

Сравнение токенов недели и года недели

Тип Локальный ISO
Номер недели w / ww / wo W / WW
Год недели gg / gggg GG / GGGG

Типовые сценарии применения

Аналитика по неделям

Используется ISO-схема:

GGGG-[W]WW

Обеспечивает стабильные бизнес-метрики без смещения между годами.


Локальные отчёты

Используется локальная схема:

gggg-[w]ww

Подходит для региональных календарей и пользовательских интерфейсов.


Группировка данных

При агрегации данных по неделям важно использовать комбинацию:

  • год недели
  • номер недели

Иначе возникает дублирование или пересечение периодов.


Итоговая логика токенов

  • W / WW → ISO-неделя
  • w / ww / wo → локальная неделя
  • GGGG / GG → ISO год недели
  • gggg / gg → локальный год недели

Корректное использование этих токенов обеспечивает точное отображение недельных периодов без смещения между календарными годами.