В библиотеке 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 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());
Теперь исходная дата остаётся неизменной.
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
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-нумерации используется isoWeekday().
const date = moment('2026-05-21');
console.log(date.isoWeekday());
Соответствие значений:
| Значение | День |
|---|---|
| 1 | Понедельник |
| 2 | Вторник |
| 3 | Среда |
| 4 | Четверг |
| 5 | Пятница |
| 6 | Суббота |
| 7 | Воскресенье |
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());
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);
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);
const sameISOWeek =
a.isoWeek() === b.isoWeek() &&
a.isoWeekYear() === b.isoWeekYear();
console.log(sameISOWeek);
Иногда 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-недели |