Получение дня месяца

В Moment.js получение дня месяца относится к работе с календарной датой и реализуется через метод date(). Этот метод возвращает числовое значение от 1 до 31, соответствующее текущему дню месяца в объекте Moment.

Ключевой момент заключается в разграничении понятий:

  • день месяца (1–31)
  • день недели (0–6 или 1–7 в зависимости от локали и конфигурации)

Moment.js использует разные методы для этих сущностей, и их смешение приводит к логическим ошибкам в обработке дат.


Получение дня месяца через date()

Основной способ получения номера дня месяца:

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

console.log(dayOfMonth); // 21

Метод date() не требует параметров при чтении значения и возвращает текущий день месяца объекта Moment.


Альтернативный способ через get('date')

Moment.js поддерживает универсальный доступ к компонентам даты через метод get:

const m = moment('2026-05-21');
const dayOfMonth = m.get('date');

console.log(dayOfMonth); // 21

Функционально результат идентичен date(), однако get() применяется в случаях, когда требуется динамическое обращение к различным полям даты через строковый ключ.


Установка дня месяца

Метод date() также используется для изменения дня месяца:

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

console.log(m.format('YYYY-MM-DD')); // 2026-05-10

Изменение значения корректирует дату с учётом особенностей календаря. При установке значения, превышающего количество дней в месяце, Moment.js автоматически нормализует дату.


Нормализация дат при выходе за пределы месяца

Moment.js выполняет автоматическую коррекцию:

const m = moment('2026-01-31');
m.date(40);

console.log(m.format('YYYY-MM-DD')); // 2026-02-09

Значение 40 выходит за пределы января, поэтому происходит перенос в следующий месяц с сохранением остатка дней.


Отличие date() от day()

Одна из наиболее частых ошибок — использование day() вместо date().

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

console.log(m.date()); // 21
console.log(m.day());  // 4 (день недели)

day() возвращает индекс дня недели:

  • 0 — воскресенье
  • 1 — понедельник
  • 6 — суббота

Таким образом, day() не имеет отношения к числу месяца и используется для работы с недельным циклом.


Использование в форматировании строк

Для отображения дня месяца применяется токен DD или D:

const m = moment('2026-05-05');

console.log(m.format('D'));   // 5
console.log(m.format('DD'));  // 05

Разница заключается в ведущем нуле:

  • D — без ведущего нуля
  • DD — фиксированная двухзначная форма

Практическое извлечение и преобразование

Комбинация методов часто используется при работе с календарными интерфейсами и вычислениями:

const m = moment();

const currentDay = m.date();
const nextDay = moment(m).date(currentDay + 1);

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

Такой подход позволяет безопасно создавать новые даты без мутации исходного объекта.


Работа с локальными и копированными объектами

Moment.js мутирует исходный объект при вызове date(n), поэтому для сохранения неизменности используется клонирование:

const m1 = moment('2026-05-21');
const m2 = m1.clone().date(1);

console.log(m1.format('YYYY-MM-DD')); // 2026-05-21
console.log(m2.format('YYYY-MM-DD')); // 2026-05-01

Клонирование предотвращает побочные эффекты при цепочках преобразований дат.


Взаимодействие с другими компонентами даты

Извлечение дня месяца часто используется вместе с другими методами:

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

const result = {
  year: m.year(),
  month: m.month() + 1,
  day: m.date()
};

Важно учитывать, что month() возвращает значение от 0 до 11, что требует корректировки при выводе.