Получение объекта недели

В библиотеке Moment.js понятие недели играет важную роль при работе с календарями, расписаниями, отчётами, статистикой и бизнес-логикой. Week API позволяет получать номер недели, объект начала или конца недели, а также выполнять вычисления относительно недельных интервалов.

Метод week()

Метод week() возвращает номер недели в году.

const moment = require('moment');

const date = moment('2026-05-21');

console.log(date.week());

Результат:

21

В данном случае дата относится к 21-й неделе года.

Установка номера недели

Метод week() способен не только получать номер недели, но и изменять его.

const date = moment('2026-01-10');

date.week(20);

console.log(date.format('YYYY-MM-DD'));

Moment автоматически пересчитает дату в соответствии с указанной неделей.

ISO-недели

Во многих странах используется стандарт ISO 8601, согласно которому:

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

Для работы с ISO-неделями используется метод isoWeek().

const date = moment('2026-05-21');

console.log(date.isoWeek());

Отличия week() и isoWeek()

Разница особенно заметна в начале и конце года.

const date = moment('2022-01-01');

console.log(date.week());
console.log(date.isoWeek());

Результаты могут отличаться:

1
52

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

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

Для получения объекта даты, соответствующего началу недели, применяется метод startOf('week').

const date = moment('2026-05-21');

const startWeek = date.clone().startOf('week');

console.log(startWeek.format('YYYY-MM-DD'));

Использование clone()

Методы startOf() и endOf() изменяют исходный объект Moment.

Без clone():

const date = moment();

date.startOf('week');

console.log(date.format());

Исходный объект будет изменён.

С clone():

const date = moment();

const startWeek = date.clone().startOf('week');

console.log(date.format());
console.log(startWeek.format());

Теперь исходная дата остаётся неизменной.

Получение начала ISO-недели

const date = moment('2026-05-21');

const startISOWeek = date.clone().startOf('isoWeek');

console.log(startISOWeek.format('YYYY-MM-DD'));

ISO-неделя всегда начинается с понедельника.

Получение конца недели

Метод endOf('week') возвращает конец недели.

const date = moment('2026-05-21');

const endWeek = date.clone().endOf('week');

console.log(endWeek.format());

Пример результата:

2026-05-23T23:59:59+06:00

Конец ISO-недели

const date = moment('2026-05-21');

const endISOWeek = date.clone().endOf('isoWeek');

console.log(endISOWeek.format());

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

Для вычислений внутри недели часто используется метод weekday().

const date = moment('2026-05-21');

console.log(date.weekday());

Установка дня недели

const date = moment('2026-05-21');

date.weekday(0);

console.log(date.format('YYYY-MM-DD'));

Значение 0 соответствует первому дню недели согласно локали.

ISO-дни недели

Для строгой ISO-нумерации используется isoWeekday().

const date = moment('2026-05-21');

console.log(date.isoWeekday());

Соответствие значений:

Значение День
1 Понедельник
2 Вторник
3 Среда
4 Четверг
5 Пятница
6 Суббота
7 Воскресенье

Изменение ISO-дня недели

const date = moment('2026-05-21');

date.isoWeekday(1);

console.log(date.format('YYYY-MM-DD'));

Получение количества недель в году

Метод weeksInYear() возвращает число недель.

const date = moment('2026-01-01');

console.log(date.weeksInYear());

ISO-вариант

const date = moment('2026-01-01');

console.log(date.isoWeeksInYear());

Некоторые годы содержат 53 недели.

Работа с локалью недели

Начало недели зависит от локали.

moment.locale('ru');

const date = moment('2026-05-21');

console.log(date.startOf('week').format('dddd'));

Для русской локали неделя начинается с понедельника.

Английская локаль

moment.locale('en');

const date = moment('2026-05-21');

console.log(date.startOf('week').format('dddd'));

В английской локали неделя может начинаться с воскресенья.

Получение объекта текущей недели

const currentWeek = moment().week();

console.log(currentWeek);

Текущая ISO-неделя

const currentISOWeek = moment().isoWeek();

console.log(currentISOWeek);

Получение всех дней текущей недели

const start = moment().startOf('isoWeek');

const days = [];

for (let i = 0; i < 7; i++) {
    days.push(start.clone().add(i, 'days').format('YYYY-MM-DD'));
}

console.log(days);

Результат:

[
  '2026-05-18',
  '2026-05-19',
  '2026-05-20',
  '2026-05-21',
  '2026-05-22',
  '2026-05-23',
  '2026-05-24'
]

Сравнение недель

Проверка принадлежности одной неделе

const a = moment('2026-05-21');
const b = moment('2026-05-23');

const sameWeek =
    a.week() === b.week() &&
    a.year() === b.year();

console.log(sameWeek);

Проверка ISO-недели

const sameISOWeek =
    a.isoWeek() === b.isoWeek() &&
    a.isoWeekYear() === b.isoWeekYear();

console.log(sameISOWeek);

Получение года ISO-недели

Иногда ISO-неделя относится к другому году.

const date = moment('2021-01-01');

console.log(date.isoWeekYear());

Результат:

2020

Дата находится в ISO-неделе предыдущего года.

Генерация диапазона недели

const start = moment().startOf('isoWeek');
const end = moment().endOf('isoWeek');

console.log(
    `${start.format('DD.MM.YYYY')} - ${end.format('DD.MM.YYYY')}`
);

Практический пример календарной сетки

const start = moment().startOf('month').startOf('week');

const calendar = [];

for (let i = 0; i < 42; i++) {
    calendar.push(
        start.clone().add(i, 'days').format('YYYY-MM-DD')
    );
}

console.log(calendar);

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

Практический пример отчёта по неделям

const orders = [
    { date: '2026-05-18', amount: 100 },
    { date: '2026-05-20', amount: 200 },
    { date: '2026-05-28', amount: 300 }
];

const grouped = {};

orders.forEach(order => {
    const week = moment(order.date).isoWeek();

    if (!grouped[week]) {
        grouped[week] = 0;
    }

    grouped[week] += order.amount;
});

console.log(grouped);

Результат:

{
  '21': 300,
  '22': 300
}

Частые ошибки

Изменение исходного объекта

const date = moment();

const start = date.startOf('week');

После выполнения date и start указывают на один и тот же изменённый объект.

Правильный вариант:

const start = date.clone().startOf('week');

Путаница между week() и isoWeek()

moment('2022-01-01').week();
moment('2022-01-01').isoWeek();

Результаты могут отличаться, особенно в январе и декабре.

Игнорирование локали

moment.locale('en');
moment().startOf('week');

Начало недели зависит от активной локали.

Методы работы с неделями

Метод Назначение
week() Получение или установка недели
isoWeek() Работа с ISO-неделями
weekday() День недели по локали
isoWeekday() ISO-день недели
startOf('week') Начало недели
endOf('week') Конец недели
startOf('isoWeek') Начало ISO-недели
endOf('isoWeek') Конец ISO-недели
weeksInYear() Количество недель
isoWeeksInYear() Количество ISO-недель
isoWeekYear() Год ISO-недели