В Moment.js работа с неделями года основана на двух взаимосвязанных концепциях: номер недели и год недели (week year). Эти понятия отличаются от привычного календарного года, поскольку границы недели могут «перетягивать» даты на соседний год.
Moment.js поддерживает несколько токенов для отображения номера недели в зависимости от локали или стандарта ISO.
Локальная система недель зависит от настроек регионального формата (например, первый день недели и правило первой недели года).
Примеры:
w: 3ww: 03wo: 3rdОсобенность локальной недели заключается в том, что начало недели и правила первой недели года могут отличаться. В некоторых локалях неделя начинается в воскресенье, в других — в понедельник.
ISO 8601 определяет строгий стандарт недель:
Для ISO-недель используются следующие токены:
Примеры:
W: 7WW: 07ISO-недели часто используются в корпоративных системах, аналитике и логистике, где требуется строгая согласованность календарных периодов.
Год недели — это отдельная система, отличная от календарного года
(YYYY). Он привязан не к 1 января, а к логике недель.
Примеры:
gg: 24gggg: 2024Локальный год недели может начинаться в конце декабря предыдущего календарного года, если первая неделя включает дни нового года.
ISO-год недели используется вместе с ISO-неделями и является наиболее строгой системой недельного календаря.
Примеры:
GG: 24GGGG: 2024Наиболее важная особенность Moment.js заключается в том, что
неделя и год недели всегда связаны между собой. Нельзя
корректно использовать W или w без
соответствующего GGGG или gggg, если требуется
точная идентификация периода.
gggg-[W]W → локальный год недели + номер неделиGGGG-[W]WW → ISO год недели + ISO неделяПри переходе между декабрём и январём возникает ключевая особенность:
Это приводит к различию между:
YYYY)GGGG или gggg)Дата: 2025-01-01
YYYY: 2025GGGG: может быть 2024 (если дата попадает в последнюю
ISO-неделю 2024 года)GGGG-[W]WW
Вывод:
2024-W05
gggg-[w]ww
Вывод:
2024-w05
GGGG-[W]WW (dddd)
Вывод:
2024-W05 (Monday)
YYYY не учитывает правила ISO-недели, что приводит к
некорректной группировке данных по неделям.
w — локальная неделяW — ISO-неделяИх нельзя считать эквивалентными, особенно в аналитических системах.
Использование:
YYYY-WW
является логически некорректным, поскольку календарный год и ISO-неделя могут принадлежать разным периодам.
Moment.js рассчитывает номер недели на основе внутренних правил:
locale)| Тип | Локальный | 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 → локальный год неделиКорректное использование этих токенов обеспечивает точное отображение недельных периодов без смещения между календарными годами.