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

Moment.js предоставляет набор инструментов для работы с датами, где одна из ключевых задач — корректное определение и манипуляция днём недели. В JavaScript эта тема осложняется различиями в индексах, локалях и форматах отображения, поэтому библиотека вводит несколько согласованных методов для унификации поведения.

Основной метод для получения дня недели:

moment().day();

Он возвращает число от 0 до 6, где:

  • 0 — воскресенье
  • 1 — понедельник
  • 2 — вторник
  • 3 — среда
  • 4 — четверг
  • 5 — пятница
  • 6 — суббота

Такой подход соответствует стандарту JavaScript Date.getDay(), но в рамках Moment.js он интегрирован в цепочку методов и поддерживает работу с локалями и изменением значения.

Пример:

const m = moment("2026-05-21");
console.log(m.day()); // например, 4 (четверг)

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

Метод day() является перегруженным: он не только возвращает значение, но и изменяет его.

moment().day(0); // установка на воскресенье
moment().day(1); // понедельник

При изменении дня недели библиотека автоматически пересчитывает дату, сохраняя текущую неделю:

const m = moment("2026-05-21"); // четверг
m.day(1); // перенос на понедельник той же недели

Если текущее значение дня недели больше целевого, дата смещается назад; если меньше — вперёд.

ISO-нумерация дней недели

В европейских стандартах неделя начинается с понедельника, а воскресенье имеет значение 7. Для этого используется:

moment().isoWeekday();

Значения:

  • 1 — понедельник
  • 2 — вторник
  • 7 — воскресенье

Пример получения:

const m = moment("2026-05-21");
console.log(m.isoWeekday()); // 4 (четверг)

Установка:

m.isoWeekday(1); // установить понедельник

Различие между day() и weekday()

Существует ещё один метод:

moment().weekday();

Он похож на day(), но учитывает локальные настройки первого дня недели.

Ключевое различие:

  • day() — всегда фиксированная схема 0–6 (воскресенье → суббота)
  • weekday() — зависит от локали (например, в Европе неделя начинается с понедельника)

Пример:

moment.locale('ru');

const m = moment("2026-05-21");

m.weekday(); // значение относительно локальной недели
m.day();     // фиксированное значение

Локализация дня недели

Одно из сильных мест Moment.js — локализация:

moment.locale('ru');

const m = moment();
console.log(m.format('dddd')); // "четверг"
console.log(m.format('ddd'));  // "чт"

Форматы:

  • ddd — сокращённое название дня
  • dddd — полное название дня

Это важно при построении интерфейсов, где требуется отображение дней недели в человекочитаемом виде.

Приведение к началу недели

Часто требуется получить первый день недели:

moment().startOf('week');

По умолчанию это воскресенье, но зависит от локали:

moment.locale('ru');
moment().startOf('week'); // понедельник

Аналогично для ISO-недели:

moment().startOf('isoWeek'); // всегда понедельник

Практические сценарии использования

Группировка данных по дням недели

const data = [
  "2026-05-19",
  "2026-05-20",
  "2026-05-21"
];

const grouped = {};

data.forEach(date => {
  const m = moment(date);
  const day = m.format('dddd');

  if (!grouped[day]) grouped[day] = [];
  grouped[day].push(date);
});

Проверка конкретного дня недели

const m = moment("2026-05-21");

if (m.isoWeekday() === 5) {
  // пятница
}

Перенос даты на ближайший понедельник

const m = moment();
m.isoWeekday(1);

Работа с диапазонами недель

При вычислениях календарных интервалов важно учитывать, как определяется неделя:

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

Это позволяет получить стабильный диапазон от понедельника до воскресенья независимо от локали отображения.

Особенности индексации и частые ошибки

Ошибка 1: путаница между day и isoWeekday

moment().day(7); // не ISO-система
moment().isoWeekday(7); // воскресенье в ISO

Ошибка 2: ожидание понедельника как 0

В Moment.js понедельник не равен 0 ни в одной стандартной системе.

Ошибка 3: игнорирование локали

moment.locale('en'); // неделя начинается с воскресенья
moment.locale('ru'); // неделя начинается с понедельника

Это влияет на weekday() и startOf('week').

Форматирование для UI

Часто требуется вывести день недели в разных форматах:

moment().format('d');    // 0-6
moment().format('dd');   // Su, Mo...
moment().format('ddd');  // сокращённое имя
moment().format('dddd'); // полное имя

Итоговая модель понимания дней недели

Moment.js предлагает три уровня работы с днями недели:

  • Фиксированная модель (day) — JavaScript-совместимая
  • Локализованная модель (weekday) — зависит от региона
  • ISO-модель (isoWeekday) — международный стандарт

Такое разделение позволяет точно управлять календарной логикой в любых сценариях: от простых интерфейсов до сложных систем планирования и аналитики дат.