Работа с месяцами в библиотеке 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
Это значение соответствует маю, поскольку отсчёт начинается с нуля:
Такое представление часто становится источником ошибок при работе с календарной логикой, особенно при интеграции с 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();
Здесь происходит последовательная обработка:
Такой подход характерен для вычислений, связанных с календарной арифметикой.
Метод 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 лишь абстрагирует этот механизм, сохраняя совместимость.
Основные последствия:
Получение месяца часто используется для фильтрации данных:
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('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')
};
Такое разделение позволяет отделить бизнес-логику от слоя представления без потери точности работы с датами.