Извлечение года, месяца и дня

Библиотека Day.js предоставляет компактный и предсказуемый API для работы с датами в JavaScript. Одной из базовых операций является получение отдельных компонентов даты: года, месяца и дня. Эти значения могут извлекаться как через методы-геттеры, так и через универсальный интерфейс доступа к полям.


Основные методы доступа к компонентам даты

Day.js использует набор методов, соответствующих стандартным частям календарной даты:

  • year() — возвращает год
  • month() — возвращает месяц (отсчёт с нуля)
  • date() — возвращает день месяца
import dayjs from 'dayjs';

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

const year = d.year();   // 2026
const month = d.month(); // 4 (май, т.к. январь = 0)
const day = d.date();    // 22

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


Особенности индексации месяца

Месяцы в Day.js нумеруются с нуля:

  • 0 — январь
  • 1 — февраль
  • 2 — март
  • 11 — декабрь
dayjs('2026-01-15').month(); // 0
dayjs('2026-12-01').month(); // 11

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

const humanMonth = dayjs().month() + 1;

Альтернативный доступ через get

Помимо специализированных методов, Day.js поддерживает универсальный интерфейс get, который позволяет извлекать компоненты даты по строковому ключу:

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

d.get('year');  // 2026
d.get('month'); // 4
d.get('date');  // 22

Поддерживаемые ключи:

  • 'year'
  • 'month'
  • 'date'
  • 'day' (день недели)
  • 'hour'
  • 'minute'
  • 'second'
  • 'millisecond'

Использование get удобно при динамическом выборе поля:

const field = 'year';
const value = dayjs().get(field);

Извлечение через форматирование

В случаях, когда требуется строковое представление, используется метод format. Он позволяет извлекать компоненты даты в заданном виде.

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

d.format('YYYY'); // "2026"
d.format('MM');   // "05"
d.format('DD');   // "22"

Основные токены

  • YYYY — полный год
  • YY — последние две цифры года
  • MM — месяц с ведущим нулём
  • M — месяц без ведущего нуля
  • DD — день месяца с ведущим нулём
  • D — день месяца без ведущего нуля
dayjs('2026-01-05').format('YYYY-M-D'); // "2026-1-5"

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


Сравнение методов извлечения

Числовые методы

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

d.year();  // число
d.month(); // число (0–11)
d.date();  // число (1–31)

Преимущества:

  • высокая производительность
  • отсутствие преобразований типов
  • удобство для вычислений

Универсальный get

d.get('year');
d.get('month');
d.get('date');

Преимущества:

  • динамический доступ к полям
  • единый интерфейс для всех компонентов даты

Недостатки:

  • менее очевиден при статическом использовании
  • строковые ключи менее строгие

Форматирование

d.format('YYYY-MM-DD');

Преимущества:

  • сразу готовое строковое представление
  • контроль над выводом

Недостатки:

  • результат строковый, а не числовой
  • требует знания токенов форматирования

Работа с текущей датой

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

const now = dayjs();

const year = now.year();
const month = now.month();
const day = now.date();

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


Особенности работы с локалью

Методы year, month и date не зависят от локали. Они возвращают абсолютные числовые значения, основанные на внутреннем представлении даты в UTC/локальном времени.

Локаль влияет только на форматирование:

dayjs('2026-05-22').format('MMMM'); // название месяца зависит от локали

Но:

dayjs('2026-05-22').month(); // всегда 4

Взаимодействие с преобразованием дат

При парсинге строк Day.js автоматически нормализует входные данные:

dayjs('2026-05-22T10:30:00')

После этого извлечение компонентов остаётся неизменным:

const d = dayjs('2026-05-22T10:30:00');

d.year();  // 2026
d.month(); // 4
d.date();  // 22

Граничные случаи

Переходы между месяцами

dayjs('2026-02-28').add(1, 'day').date(); // 1 (март)

Компоненты даты пересчитываются автоматически при изменении объекта.


Неверные даты

dayjs('invalid').year();  // NaN
dayjs('invalid').month(); // NaN

При некорректном вводе возвращаются значения NaN, что позволяет выявлять ошибки парсинга.


Извлечение нескольких компонентов одновременно

Для получения всех частей даты используется последовательный вызов методов:

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

const result = {
  year: d.year(),
  month: d.month(),
  day: d.date()
};

Альтернативно используется форматирование с последующим разбором строки, однако числовые методы остаются предпочтительнее для вычислений.


Использование в вычислениях

Извлечённые компоненты применяются в арифметике дат и бизнес-логике:

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

const nextYear = d.year() + 1;
const prevMonth = d.month() - 1;
const doubledDay = d.date() * 2;

Однако прямое изменение чисел не влияет на объект Day.js; для изменения даты используются методы set или add.


Связь с set-методами

Извлечение часто используется совместно с установкой значений:

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

const updated = d
  .year(d.year() + 1)
  .month(0)
  .date(1);

Такой подход позволяет строить новые даты на основе существующих компонентов.


Итоговые особенности извлечения компонентов

  • year(), month(), date() — основные числовые методы
  • месяц возвращается в диапазоне 0–11
  • get() обеспечивает универсальный доступ
  • format() используется для строкового извлечения
  • значения не зависят от локали
  • некорректные даты возвращают NaN
  • методы не мутируют исходный объект