Работа с годами и месяцами

В Day.js работа с датами опирается на объект, содержащий полный контекст времени, включая год и месяц как базовые компоненты календаря. Эти элементы лежат в основе большинства операций: смещения, вычисления интервалов, форматирования и нормализации дат.

Год и месяц в Day.js являются частью неизменяемого объекта. Любая операция изменения возвращает новый экземпляр, не модифицируя исходный.


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

Год

Для извлечения года используется метод year() без аргументов:

import dayjs from 'dayjs';

const date = dayjs('2026-05-22');
const year = date.year();

console.log(year); // 2026

Метод возвращает целое число, соответствующее календарному году в текущей временной зоне.


Месяц

Месяц извлекается методом month():

const date = dayjs('2026-05-22');
const month = date.month();

console.log(month); // 4

Важная особенность: месяцы нумеруются с нуля:

  • 0 — январь
  • 1 — февраль
  • 2 — март
  • 3 — апрель
  • 4 — май
  • 11 — декабрь

Такое поведение соответствует модели JavaScript Date.


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

Изменение года

Метод year(value) устанавливает новый год и возвращает новый объект:

const date = dayjs('2026-05-22');
const updated = date.year(2030);

console.log(updated.format('YYYY-MM-DD')); // 2030-05-22

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


Изменение месяца

Метод month(value) устанавливает месяц:

const date = dayjs('2026-05-22');
const updated = date.month(0);

console.log(updated.format('YYYY-MM-DD')); // 2026-01-22

Если текущий день не существует в новом месяце, происходит автоматическая нормализация:

const date = dayjs('2026-03-31');
const updated = date.month(1);

console.log(updated.format('YYYY-MM-DD')); // 2026-03-03 (или ближайшая корректная дата)

Day.js корректирует дату, чтобы сохранить валидность календаря.


Добавление и вычитание годов и месяцев

Для работы с временными интервалами используются методы add() и subtract().

Добавление годов

const date = dayjs('2026-05-22');
const result = date.add(5, 'year');

console.log(result.format('YYYY-MM-DD')); // 2031-05-22

Вычитание годов

const date = dayjs('2026-05-22');
const result = date.subtract(10, 'year');

console.log(result.format('YYYY-MM-DD')); // 2016-05-22

Добавление месяцев

const date = dayjs('2026-05-22');
const result = date.add(3, 'month');

console.log(result.format('YYYY-MM-DD')); // 2026-08-22

Вычитание месяцев

const date = dayjs('2026-05-22');
const result = date.subtract(7, 'month');

console.log(result.format('YYYY-MM-DD')); // 2025-10-22

Работа с границами месяца и года

Начало месяца

Метод startOf('month') возвращает первый день месяца:

const date = dayjs('2026-05-22');
const start = date.startOf('month');

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

Конец месяца

Метод endOf('month') возвращает последний момент месяца:

const date = dayjs('2026-02-10');
const end = date.endOf('month');

console.log(end.format('YYYY-MM-DD')); // 2026-02-28

В високосные годы результат автоматически учитывает 29 февраля.


Начало года

const date = dayjs('2026-05-22');
const start = date.startOf('year');

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

Конец года

const date = dayjs('2026-05-22');
const end = date.endOf('year');

console.log(end.format('YYYY-MM-DD')); // 2026-12-31

Разница между датами по месяцам и годам

Метод diff() позволяет вычислять разницу между датами в выбранных единицах.

Разница в годах

const a = dayjs('2030-01-01');
const b = dayjs('2026-01-01');

console.log(a.diff(b, 'year')); // 4

Разница в месяцах

const a = dayjs('2026-05-01');
const b = dayjs('2026-01-01');

console.log(a.diff(b, 'month')); // 4

При расчёте учитываются полные интервалы, без дробной части.


Форматирование годов и месяцев

Год в различных форматах

const date = dayjs('2026-05-22');

console.log(date.format('YYYY')); // 2026
console.log(date.format('YY'));   // 26

Месяц в числовом и текстовом виде

const date = dayjs('2026-05-22');

console.log(date.format('MM'));   // 05
console.log(date.format('M'));    // 5
console.log(date.format('MMMM')); // May
console.log(date.format('MMM'));  // May (или сокращение локали)

Форматы текстового месяца зависят от подключённой локали.


Особенности работы с календарными границами

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

  • операции всегда возвращают новый объект
  • месяцы индексируются с нуля
  • при переходе между месяцами выполняется автоматическая нормализация даты
  • високосные годы учитываются автоматически
  • методы startOf и endOf учитывают временную зону

Сравнение месяцев и годов

Для сравнения дат используются методы isBefore, isAfter, isSame:

const a = dayjs('2026-01-01');
const b = dayjs('2026-05-01');

console.log(a.isBefore(b, 'year'));  // false
console.log(a.isBefore(b, 'month')); // true

При указании единицы измерения сравнение происходит на уровне соответствующего компонента.


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

При изменении месяца Day.js стремится сохранить логическую целостность даты.

Пример:

const date = dayjs('2026-01-31');
const result = date.month(1);

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

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


Использование цепочек операций

Методы можно комбинировать для сложных преобразований:

const result = dayjs('2026-05-22')
  .add(2, 'year')
  .subtract(3, 'month')
  .startOf('month');

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

Цепочечный стиль сохраняет неизменяемость и упрощает композицию логики.


Влияние локали на отображение месяцев

Подключение локалей влияет только на текстовое представление:

import 'dayjs/locale/ru';
import dayjs from 'dayjs';

dayjs.locale('ru');

console.log(dayjs('2026-05-22').format('MMMM'));

Числовые операции с годами и месяцами остаются неизменными независимо от локали.


Итерации по месяцам

Хотя Day.js не предоставляет встроенного цикла по месяцам, типичный подход строится на добавлении интервалов:

let current = dayjs('2026-01-01');

for (let i = 0; i < 6; i++) {
  console.log(current.format('YYYY-MM'));
  current = current.add(1, 'month');
}

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