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

Работа с неделями играет важную роль в системах аналитики, календарях, отчётах, CRM, ERP и финансовых приложениях. Библиотека Moment.js предоставляет инструменты для получения и установки номера недели года, а также управления ISO-неделями.


Метод week()

Метод week() используется для:

  • получения номера недели;
  • установки номера недели у текущей даты.

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

const moment = require('moment');

const date = moment('2026-03-15');

console.log(date.week());

Результат:

11

Метод возвращает номер недели в году согласно локали.


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

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

const moment = require('moment');

const date = moment();

date.week(20);

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

Moment.js автоматически пересчитывает дату.


Как работает изменение недели

При установке недели:

date.week(1);

Moment.js:

  1. сохраняет текущий день недели;
  2. меняет только номер недели;
  3. пересчитывает итоговую дату.

Пример:

const date = moment('2026-08-19');

console.log(date.format('dddd')); // Wednesday

date.week(1);

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

Результат:

2025-12-31 Wednesday

Среда остаётся средой, но дата переносится в первую неделю года.


Локализация и влияние региона

Метод week() зависит от локали.

В разных странах:

  • неделя может начинаться с воскресенья;
  • неделя может начинаться с понедельника;
  • первая неделя года определяется по-разному.

Пример установки русской локали:

moment.locale('ru');

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

console.log(date.week());

ISO-недели

Для строгого международного стандарта используется ISO 8601.

Особенности ISO:

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

Для работы используются методы:

  • isoWeek()
  • isoWeeks()

Метод isoWeek()

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

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

console.log(date.isoWeek());

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

const date = moment();

date.isoWeek(10);

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

Разница между week() и isoWeek()

week()

Работает согласно текущей локали.

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

isoWeek()

Всегда использует ISO-стандарт.

moment().isoWeek();

Изменение года и недели одновременно

Иногда требуется установить:

  • год;
  • номер недели;
  • день недели.

Пример:

const date = moment();

date.year(2026);
date.week(15);
date.day(1);

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

Работа с ISO-годом недели

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

Например:

  • 1 января может относиться к последней ISO-неделе прошлого года;
  • 31 декабря может относиться к первой ISO-неделе следующего года.

Для работы используются:

  • isoWeekYear()
  • weekYear()

Метод isoWeekYear()

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

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

console.log(date.isoWeekYear());

Результат:

2020

Хотя календарный год — 2021, ISO-неделя относится к 2020 году.


Установка ISO-года

const date = moment();

date.isoWeekYear(2027);

console.log(date.format());

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

Очень распространённый сценарий — построение даты по:

  • номеру недели;
  • дню недели.

Пример:

const date = moment();

date.week(25).day(3);

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

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

Метод weekday() учитывает локаль.

const date = moment();

date.weekday(0);

В зависимости от региона:

  • 0 может быть понедельником;
  • 0 может быть воскресеньем.

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

Для ISO-стандарта применяется isoWeekday().

Нумерация:

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

Пример:

const date = moment();

date.isoWeek(12).isoWeekday(1);

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

Создание расписаний по неделям

Генерация начала недели

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

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

Генерация конца недели

const end = moment().week(30).endOf('week');

console.log(end.format('YYYY-MM-DD HH:mm:ss'));

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

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

const end = moment()
    .isoWeek(18)
    .endOf('isoWeek');

console.log(start.format());
console.log(end.format());

Проверка номера недели

Moment.js автоматически корректирует значения.

Пример:

const date = moment();

date.week(60);

console.log(date.format());

Библиотека перенесёт дату на следующий год.


Отрицательные значения

const date = moment();

date.week(-1);

console.log(date.format());

Moment.js выполнит перерасчёт относительно предыдущих недель.


Установка недели через объект

Метод set() позволяет изменять неделю как часть набора параметров.

const date = moment();

date.set({
    week: 40
});

console.log(date.format());

Комбинирование с startOf()

Начало ISO-недели

const date = moment()
    .isoWeek(8)
    .startOf('isoWeek');

console.log(date.format());

Начало локальной недели

const date = moment()
    .week(8)
    .startOf('week');

console.log(date.format());

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

function getWeekStart(year, week) {
    return moment()
        .year(year)
        .week(week)
        .startOf('week');
}

const result = getWeekStart(2026, 35);

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

Построение даты по ISO-правилам

function buildISODate(year, week, weekday) {
    return moment()
        .isoWeekYear(year)
        .isoWeek(week)
        .isoWeekday(weekday);
}

const date = buildISODate(2026, 20, 1);

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

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

Метод определяет количество недель в году.

const weeks = moment().weeksInYear();

console.log(weeks);

ISO-вариант количества недель

const weeks = moment().isoWeeksInYear();

console.log(weeks);

Некоторые годы содержат:

  • 52 недели;
  • 53 недели.

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

const year = 2026;
const week = 53;

const maxWeeks = moment().isoWeekYear(year).isoWeeksInYear();

if (week <= maxWeeks) {
    console.log('Корректная неделя');
}

Изменяемость объектов Moment.js

Moment.js изменяет исходный объект.

const original = moment();

const modified = original.week(15);

console.log(original.format());
console.log(modified.format());

Обе переменные содержат одинаковый объект.


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

Чтобы избежать изменения исходной даты:

const original = moment();

const modified = original.clone().week(15);

console.log(original.format());
console.log(modified.format());

Цепочки методов

Moment.js поддерживает fluent-интерфейс.

const date = moment()
    .year(2026)
    .week(12)
    .day(5)
    .startOf('day');

console.log(date.format());

Работа с UTC

Установка недели может выполняться в UTC.

const date = moment.utc();

date.isoWeek(14);

console.log(date.format());

Использование с часовыми поясами

При подключении moment-timezone:

const moment = require('moment-timezone');

const date = moment.tz('2026-05-10', 'Europe/Moscow');

date.isoWeek(25);

console.log(date.format());

Типичные ошибки

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

moment().week(1);
moment().isoWeek(1);

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


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

moment.locale('en');

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


Неожиданное изменение года

moment('2026-01-01').isoWeek();

Дата может относиться к предыдущему ISO-году.


Рекомендации по использованию

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

Подходит для:

  • международных систем;
  • аналитики;
  • корпоративных приложений;
  • ERP;
  • финансовых платформ.

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

Подходит для:

  • локальных календарей;
  • интерфейсов, зависящих от региона;
  • национальных стандартов отображения дат.

Сравнение методов

Метод Назначение
week() Локальная неделя
isoWeek() ISO-неделя
weekYear() Локальный год недели
isoWeekYear() ISO-год недели
weeksInYear() Количество локальных недель
isoWeeksInYear() Количество ISO-недель
weekday() День недели по локали
isoWeekday() ISO-день недели

Комплексный пример

const moment = require('moment');

moment.locale('ru');

const schedule = moment()
    .isoWeekYear(2026)
    .isoWeek(18)
    .isoWeekday(1)
    .startOf('day');

console.log({
    date: schedule.format('YYYY-MM-DD'),
    week: schedule.isoWeek(),
    year: schedule.isoWeekYear(),
    weekday: schedule.isoWeekday()
});

Результат:

{
    date: '2026-04-27',
    week: 18,
    year: 2026,
    weekday: 1
}