В разных странах неделя начинается по-разному. В большинстве европейских стран первым днём недели считается понедельник, а в США — воскресенье. Кроме того, различается правило определения первой недели года.
Библиотека Moment.js учитывает региональные настройки и предоставляет отдельный набор методов для работы с локализованными неделями.
Основные задачи локализованных недель:
week()Метод week() возвращает номер недели года в соответствии
с текущей локалью.
const moment = require('moment');
const date = moment('2025-01-10');
console.log(date.week());
Результат зависит от активной локали.
Для корректной работы локализованных недель необходимо установить локаль.
moment.locale('ru');
После установки русской локали неделя будет начинаться с понедельника.
Для американской локали:
moment.locale('en');
В этом случае неделя начинается с воскресенья.
week() и isoWeek()Moment.js поддерживает два разных стандарта недель:
| Метод | Стандарт |
|---|---|
week() |
локализованные недели |
isoWeek() |
ISO 8601 |
Стандарт ISO всегда использует:
Пример:
const date = moment('2025-01-01');
console.log(date.week());
console.log(date.isoWeek());
В зависимости от локали результаты могут различаться.
Метод startOf('week') возвращает начало недели по
локали.
const now = moment();
console.log(now.startOf('week').format('YYYY-MM-DD'));
Для русской локали результатом будет понедельник.
Для американской — воскресенье.
Метод endOf('week') возвращает последний момент
недели.
const now = moment();
console.log(
now.endOf('week').format('YYYY-MM-DD HH:mm:ss')
);
moment.locale('ru');
console.log(
moment('2025-03-05')
.startOf('week')
.format('dddd')
);
moment.locale('en');
console.log(
moment('2025-03-05')
.startOf('week')
.format('dddd')
);
Результат:
понедельник
Sunday
Метод week(number) позволяет установить неделю года.
const date = moment();
date.week(20);
console.log(date.format('YYYY-MM-DD'));
Moment автоматически пересчитает дату.
Иногда неделя относится к другому году.
Например:
Для получения года локализованной недели используется метод
weekYear().
const date = moment('2021-01-01');
console.log(date.weekYear());
Для ISO-стандарта существует отдельный метод:
console.log(
moment('2021-01-01').isoWeekYear()
);
Moment.js позволяет изменять правила вычисления недель.
Используется метод updateLocale().
dowdow — первый день недели.
| Значение | День |
|---|---|
| 0 | воскресенье |
| 1 | понедельник |
| 6 | суббота |
Пример:
moment.updateLocale('custom', {
week: {
dow: 1
}
});
moment.locale('custom');
doydoy определяет правило первой недели года.
Например:
moment.updateLocale('custom', {
week: {
dow: 1,
doy: 4
}
});
Здесь:
Это соответствует ISO 8601.
Получение текущих настроек:
console.log(
moment.localeData()._week
);
Результат:
{
dow: 1,
doy: 4
}
moment.locale('ru');
const current = moment();
const start = current.clone().startOf('week');
for (let i = 0; i < 7; i++) {
console.log(
start.clone()
.add(i, 'days')
.format('dddd DD.MM.YYYY')
);
}
Moment.js поддерживает специальные токены форматирования.
| Токен | Описание |
|---|---|
w |
номер недели |
ww |
номер недели с нулём |
gggg |
год локализованной недели |
Пример:
const date = moment();
console.log(
date.format('ww')
);
| Токен | Описание |
|---|---|
W |
ISO-неделя |
WW |
ISO-неделя с нулём |
GGGG |
ISO-год недели |
Пример:
console.log(
moment().format('WW')
);
const date = moment('2025-01-01');
console.log('week:', date.week());
console.log('isoWeek:', date.isoWeek());
Особенно важно учитывать локализованные недели в:
Пример:
const date = moment('2020-12-31');
console.log(date.week());
console.log(date.weekYear());
Метод weekday() работает с локализованными неделями.
moment.locale('ru');
const date = moment();
console.log(date.weekday());
При русской локали:
| Значение | День |
|---|---|
| 0 | понедельник |
| 6 | воскресенье |
const date = moment();
date.weekday(0);
console.log(
date.format('dddd')
);
day() и
weekday()| Метод | Особенность |
|---|---|
day() |
воскресенье всегда 0 |
weekday() |
зависит от локали |
Пример:
moment.locale('ru');
const date = moment();
console.log(date.day());
console.log(date.weekday());
const start = moment()
.startOf('month')
.startOf('week');
for (let i = 0; i < 6; i++) {
console.log(
start.clone()
.add(i, 'weeks')
.format('DD.MM.YYYY')
);
}
moment.locale('ru');
const start = moment()
.startOf('month')
.startOf('week');
const days = [];
for (let i = 0; i < 42; i++) {
days.push(
start.clone()
.add(i, 'days')
.format('DD.MM.YYYY')
);
}
console.log(days);
При использовании Moment Timezone вычисления недель происходят после применения временной зоны.
const date = moment.tz(
'2025-01-01 10:00',
'Europe/Moscow'
);
console.log(date.week());
Методы startOf() и endOf() изменяют объект
Moment.
Ошибка:
const date = moment();
const start = date.startOf('week');
console.log(date.format());
Безопасный вариант:
const date = moment();
const start = date.clone().startOf('week');
Ошибка:
date.week();
date.isoWeek();
Использование двух стандартов одновременно может приводить к неправильным вычислениям.
moment.locale('ru');
Без установки локали поведение может отличаться от ожидаемого.
moment.locale('ru');
const currentWeek = moment().week();
const events = [
{
title: 'Совещание',
date: '2025-05-12'
},
{
title: 'Презентация',
date: '2025-05-15'
}
];
events.forEach(event => {
const week = moment(event.date).week();
if (week === currentWeek) {
console.log(event.title);
}
});
function getWeekRange(date) {
return {
start: moment(date)
.startOf('week')
.format('YYYY-MM-DD'),
end: moment(date)
.endOf('week')
.format('YYYY-MM-DD')
};
}
console.log(
getWeekRange('2025-06-15')
);
moment.defineLocale('my-locale', {
week: {
dow: 1,
doy: 7
}
});
moment.locale('my-locale');
| Метод | Назначение |
|---|---|
week() |
номер локализованной недели |
weekYear() |
год локализованной недели |
weekday() |
день недели по локали |
startOf('week') |
начало недели |
endOf('week') |
конец недели |
| Метод | Назначение |
|---|---|
isoWeek() |
ISO-неделя |
isoWeekYear() |
ISO-год |
isoWeekday() |
ISO-день недели |
startOf('isoWeek') |
начало ISO-недели |
endOf('isoWeek') |
конец ISO-недели |
| Особенность | week() |
isoWeek() |
|---|---|---|
| Зависит от локали | Да | Нет |
| Первый день недели | зависит от локали | понедельник |
| Международный стандарт | Нет | Да |
| Использование в ISO 8601 | Нет | Да |
Локализованные недели особенно важны в следующих сценариях: