В 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
Важная особенность: месяцы нумеруются с нуля:
Такое поведение соответствует модели 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');
}
Такая модель используется при построении календарей, отчётов и графиков.