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

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

Числовое получение месяца

Основной метод для получения месяца из даты — month(). Он возвращает число от 0 до 11, отражающее текущий месяц объекта Moment.

const moment = require('moment');

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

const monthIndex = date.month();
console.log(monthIndex);

Для даты 21 мая 2026 года результат будет:

4

Это значение соответствует маю, поскольку отсчёт начинается с нуля:

  • 0 — январь
  • 1 — февраль
  • 2 — март
  • 3 — апрель
  • 4 — май
  • 5 — июнь
  • 6 — июль
  • 7 — август
  • 8 — сентябрь
  • 9 — октябрь
  • 10 — ноябрь
  • 11 — декабрь

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

Преобразование индекса месяца в «человеческий» формат

Чтобы получить привычный номер месяца (1–12), используется простое преобразование:

const humanMonth = date.month() + 1;
console.log(humanMonth);

Для мая результат будет:

5

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


Форматирование месяца в строку

Помимо числового представления, Moment.js предоставляет мощную систему форматирования через метод format().

Полный числовой формат

date.format('M')   // 5
date.format('MM')  // 05
  • M — месяц без ведущего нуля (1–12)
  • MM — месяц с ведущим нулём (01–12)

Эти форматы применяются при генерации дат для интерфейсов, логов и API-ответов.


Текстовое представление месяца

Moment.js позволяет получать название месяца в различных формах.

date.format('MMM')

Результат:

May

Расширенный формат:

date.format('MMMM')

Результат:

May

В английской локали MMM возвращает сокращённое название месяца, а MMMM — полное. Однако при смене локали результат меняется автоматически.


Работа с локализацией месяцев

Одним из ключевых преимуществ Moment.js является встроенная поддержка локалей. Названия месяцев зависят от текущей языковой настройки.

const moment = require('moment');
require('moment/locale/ru');

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

date.locale('ru');

console.log(date.format('MMMM'));

Результат:

май

При использовании русской локали:

  • MMMM → май, июнь, июль и т.д.
  • MMM → сокращённые формы (мая, июн, июл и т.д. в зависимости от контекста локали)

Локализация влияет не только на отображение, но и на внутренние правила форматирования, включая грамматические особенности.


Извлечение месяца как части цепочки методов

Метод month() часто используется в цепочках преобразований:

const month = moment().add(10, 'days').month();

Здесь происходит последовательная обработка:

  1. Получение текущей даты
  2. Добавление 10 дней
  3. Извлечение месяца результата

Такой подход характерен для вычислений, связанных с календарной арифметикой.


Изменение месяца через month()

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

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

date.month(0); // устанавливаем январь

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

Результат:

2026-01-21

При этом важно учитывать поведение при переполнении дат. Если текущий день не существует в новом месяце, Moment.js автоматически корректирует дату.

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

date.month(1); // февраль

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

Февраль не содержит 31 числа, поэтому результат будет скорректирован:

2026-03-03

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


Получение месяца в различных форматах одновременно

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

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

const data = {
  index: date.month(),
  human: date.month() + 1,
  shortName: date.format('MMM'),
  fullName: date.format('MMMM'),
  padded: date.format('MM')
};

console.log(data);

Пример результата:

{
  "index": 4,
  "human": 5,
  "shortName": "May",
  "fullName": "May",
  "padded": "05"
}

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


Особенности нумерации месяцев

Нулевая индексация месяцев в Moment.js исторически повторяет подход JavaScript Date, где метод getMonth() также возвращает значение от 0 до 11.

new Date().getMonth()

Moment.js лишь абстрагирует этот механизм, сохраняя совместимость.

Основные последствия:

  • Прямое сравнение с календарными значениями (1–12) требует преобразования
  • Ошибки часто возникают при ручной арифметике месяцев
  • Логика интерфейса почти всегда требует добавления +1

Использование месяца в условиях и фильтрации

Получение месяца часто используется для фильтрации данных:

const targetMonth = 4; // май (0-based)

const dates = [
  moment('2026-05-01'),
  moment('2026-06-01'),
  moment('2026-05-21')
];

const filtered = dates.filter(d => d.month() === targetMonth);

console.log(filtered.length);

Результат:

2

Такая логика применяется в аналитике, финансовых системах и календарных выборках.


Формирование ключей по месяцу

В задачах агрегации данных месяц часто используется как ключ:

const moment = require('moment');

const transactions = [
  { date: moment('2026-05-01'), amount: 100 },
  { date: moment('2026-05-10'), amount: 200 },
  { date: moment('2026-06-01'), amount: 300 }
];

const grouped = {};

transactions.forEach(t => {
  const key = t.date.format('YYYY-MM');
  if (!grouped[key]) grouped[key] = 0;
  grouped[key] += t.amount;
});

console.log(grouped);

Результат:

{
  "2026-05": 300,
  "2026-06": 300
}

Хотя здесь используется форматирование, понимание месяца через month() лежит в основе подобных операций.


Сравнение month() и format()

Метод month() и форматирование через format() решают разные задачи:

  • month() — числовая логика, вычисления, сравнения
  • format('M/MM/MMM/MMMM') — представление для пользователя

Пример комбинирования:

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

if (date.month() === 4) {
  console.log(`Это ${date.format('MMMM')}`);
}

Результат:

Это May

Работа с месяцем в диапазонах

При вычислении диапазонов дат месяц часто участвует косвенно:

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

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

Здесь определяется полный диапазон января текущего года.


Влияние переходов между годами

При установке месяца Moment.js автоматически корректирует год:

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

date.month(-1);

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

Результат:

2025-12-15

Аналогично:

date.month(12);

переведёт дату в январь следующего года.


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

В реальных приложениях месяц обычно участвует в трёх сценариях:

  • отображение календаря
  • фильтрация данных
  • агрегация статистики

Moment.js обеспечивает единый интерфейс для всех этих задач через комбинацию month() и format().

const now = moment();

const model = {
  raw: now.month(),
  display: now.format('MMMM'),
  numeric: now.format('MM')
};

Такое разделение позволяет отделить бизнес-логику от слоя представления без потери точности работы с датами.