Moment.js предоставляет два основных подхода к работе с неделями года: локальные (зависящие от настроек языка и региона) и ISO-недели (строго стандартизированные по ISO-8601). Понимание различий между ними критично при расчётах календарных интервалов, построении отчётности и работе с временными рядами.
Неделя года — это порядковый номер недели в пределах календарного года. Однако «неделя» не является универсальным понятием:
В результате один и тот же день может принадлежать разным неделям в зависимости от выбранной системы.
Локальная неделя зависит от текущей локали Moment.js.
moment().week();
Метод week() возвращает номер недели года согласно
локальным настройкам.
Пример:
const m = moment("2026-01-10");
console.log(m.week());
Значение будет зависеть от того, какой день считается началом недели в текущей локали.
moment().week(12);
Изменяет дату так, чтобы она соответствовала указанной неделе в рамках текущего года.
ISO-недели строго определены стандартом ISO-8601:
moment().isoWeek();
Пример:
const m = moment("2026-01-10");
console.log(m.isoWeek());
moment().isoWeek(5);
Это изменяет дату в соответствии с ISO-календарём.
| Метод | Основа расчёта | Начало недели | Первая неделя года |
|---|---|---|---|
week() |
Локаль | Зависит от локали | Локальное правило |
isoWeek() |
ISO-8601 | Понедельник | Неделя с первым четвергом |
Эти различия часто приводят к ошибкам при расчёте отчётных периодов.
При работе с неделями важно учитывать, что неделя может принадлежать «другому» году.
moment().weekYear();
Возвращает год, к которому относится неделя по локальным правилам.
moment().isoWeekYear();
Используется вместе с ISO-неделями:
const m = moment("2026-01-01");
console.log(m.isoWeek());
console.log(m.isoWeekYear());
Это особенно важно в переходных датах (конец декабря / начало января), когда ISO-неделя может относиться к следующему или предыдущему году.
Moment.js поддерживает токены форматирования для недель:
w — номер недели (локальный)ww — номер недели с ведущим нулёмW — ISO-неделяWW — ISO-неделя с ведущим нулёмПримеры:
moment("2026-01-10").format("w");
moment("2026-01-10").format("ww");
moment("2026-01-10").format("W");
moment("2026-01-10").format("WW");
Эти токены позволяют формировать отчётные строки без прямого вызова
методов week() или isoWeek().
Начало недели определяется локалью:
moment.locale('en'); // воскресенье — начало недели
moment.locale('ru'); // понедельник — начало недели
Проверка текущего начала недели:
moment.localeData().firstDayOfWeek();
Это значение напрямую влияет на результат week().
Особое внимание требуется при работе с датами в конце года.
Пример:
moment("2025-12-31").week();
moment("2025-12-31").isoWeek();
В одном случае дата может относиться к 1-й неделе следующего года, в другом — к последней неделе текущего.
Такие расхождения критичны при:
При установке недели изменяется вся дата:
moment().week(1);
Это может привести к смещению месяца и года, поскольку Moment.js пересчитывает дату целиком.
Аналогично:
moment().isoWeek(1);
Важно учитывать, что изменение недели не изолировано — оно влияет на всю временную структуру объекта.
moment().week();
moment().isoWeek();
Использование разных систем в одном проекте приводит к несоответствиям отчётных данных.
Без явного задания локали результат week() может
отличаться в разных окружениях.
moment.locale('en');
Даты 29–31 декабря и 1–3 января часто относятся к разным неделям и даже годам в ISO-логике.
Пример построения ключа «год-неделя»:
const m = moment();
const keyISO = `${m.isoWeekYear()}-W${m.isoWeek()}`;
const keyLocal = `${m.weekYear()}-W${m.week()}`;
Такие ключи применяются для:
Для вычисления начала и конца недели используются комбинации
startOf и endOf:
moment().startOf('week');
moment().endOf('week');
Для ISO-недель:
moment().startOf('isoWeek');
moment().endOf('isoWeek');
Эти методы позволяют получать точные границы периода, включая время суток.
Moment.js учитывает временную зону при вычислении недели. При изменении зоны возможны сдвиги границ недели, особенно при переходе через полночь в UTC.
moment().utc().isoWeek();
Использование UTC снижает риск расхождений в распределённых системах.