Эквиваленты методов Date

Библиотека Day.js предоставляет компактную и предсказуемую альтернативу стандартному объекту Date, сохраняя при этом знакомую модель работы через цепочки вызовов и иммутабельность. Основная концепция заключается в том, что большинство методов Date имеют прямые или логически эквивалентные аналоги, сгруппированные по категориям: получение значений, установка значений, работа с временными метками и строковыми представлениями.


Получение компонентов даты (getter-эквиваленты)

В стандартном Date доступ к компонентам осуществляется через методы вида getFullYear(), getMonth() и так далее. В Day.js используется единый метод get через специализированные функции доступа.

Год, месяц, день

JavaScript Date Day.js
date.getFullYear() dayjs().year()
date.getMonth() dayjs().month()
date.getDate() dayjs().date()

Особенность:

  • month() в Day.js возвращает значение в диапазоне 0–11, аналогично Date.getMonth()
  • date() соответствует дню месяца (1–31)
const d = dayjs('2026-05-23');

d.year();  // 2026
d.month(); // 4 (май, так как отсчёт с 0)
d.date();  // 23

Время: часы, минуты, секунды, миллисекунды

JavaScript Date Day.js
getHours() hour()
getMinutes() minute()
getSeconds() second()
getMilliseconds() millisecond()
const d = dayjs('2026-05-23T14:45:30.250');

d.hour();        // 14
d.minute();      // 45
d.second();      // 30
d.millisecond(); // 250

День недели

JavaScript Date Day.js
getDay() day()
const d = dayjs('2026-05-23');
d.day(); // 6 (суббота)

Значения совпадают со стандартом ECMAScript:

  • 0 — воскресенье
  • 6 — суббота

Установка значений (setter-эквиваленты)

В Date методы изменения состояния являются мутирующими (setFullYear, setMonth и т.д.). Day.js, напротив, возвращает новый объект, не изменяя исходный.


Год, месяц, день месяца

JavaScript Date Day.js
setFullYear(y) year(y)
setMonth(m) month(m)
setDate(d) date(d)
const d = dayjs('2026-05-23');

const updated = d.year(2030);
updated.year(); // 2030
d.year();       // 2026 (оригинал не изменился)

Время

JavaScript Date Day.js
setHours(h) hour(h)
setMinutes(m) minute(m)
setSeconds(s) second(s)
setMilliseconds(ms) millisecond(ms)
const d = dayjs('2026-05-23T10:00:00');

const updated = d.hour(18).minute(30);

updated.format(); // 2026-05-23T18:30:00+...

День недели (через смещение)

В стандартном Date нет прямого setter для дня недели. В Day.js аналогичная логика реализуется через метод day():

dayjs().day(1); // установить понедельник текущей недели

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


Работа с временной меткой (timestamp)

Получение timestamp

JavaScript Date Day.js
date.getTime() valueOf()
Date.now() dayjs().valueOf()
const d = dayjs('2026-05-23T00:00:00');

d.valueOf(); // миллисекунды с 1970-01-01

Также доступна форма:

d.unix(); // секунды с эпохи UNIX

Создание из timestamp

JavaScript Date Day.js
new Date(ms) dayjs(ms)
const jsDate = new Date(1716422400000);
const d = dayjs(1716422400000);

Строковые представления даты

ISO и стандартные строки

JavaScript Date Day.js
toISOString() toISOString()
toString() toString()
const d = dayjs('2026-05-23T12:00:00Z');

d.toISOString();
d.toString();

Форматирование как расширенный аналог toLocaleString

В Date используется:

  • toLocaleDateString()
  • toLocaleTimeString()
  • toLocaleString()

В Day.js основной механизм — format():

const d = dayjs('2026-05-23T14:30:00');

d.format('YYYY-MM-DD');       // дата
d.format('HH:mm:ss');         // время
d.format('YYYY-MM-DD HH:mm'); // комбинированный формат

Фактически format() объединяет все локализационные методы Date в одну систему шаблонов.


Эквиваленты проверки и сравнения

Хотя в Date часто используют операции сравнения через getTime(), Day.js предоставляет методы высокого уровня.

JavaScript Date Day.js
a.getTime() === b.getTime() a.isSame(b)
a > b a.isAfter(b)
a < b a.isBefore(b)
const a = dayjs('2026-01-01');
const b = dayjs('2026-12-31');

a.isBefore(b); // true
a.isAfter(b);  // false
a.isSame(b);   // false

Работа с компонентами даты как единым объектом

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

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

const updated = d
  .year(2030)
  .month(0)
  .date(1)
  .hour(0)
  .minute(0)
  .second(0);

Такой подход заменяет множественные вызовы:

const jsDate = new Date();
jsDate.setFullYear(2030);
jsDate.setMonth(0);
jsDate.setDate(1);

Особенности индексации и несовпадения с ожиданиями Date API

Несмотря на схожесть, поведение Day.js сохраняет ряд особенностей ECMAScript:

  • Месяцы начинаются с нуля (0 = январь)
  • Дни недели начинаются с воскресенья (0)
  • Все операции возвращают новый объект
  • Отсутствует скрытая мутация состояния

Эти свойства делают эквивалентность с Date формальной, но не механической: логика совпадает, но модель использования отличается.


Нормализация поведения при выходе за пределы диапазонов

В Date и Day.js применяется автоматическая нормализация значений:

dayjs().month(12); // переход на следующий год
dayjs().date(32);  // переход в следующий месяц

Это эквивалентно поведению:

const d = new Date();
d.setMonth(12);

Однако Day.js сохраняет цепочный стиль и предсказуемость результата без изменения исходного объекта.


Эквивалентность через плагины

Некоторые методы Date не имеют прямых аналогов в базовом Day.js и требуют подключаемых расширений:

  • локализация
  • UTC-режим
  • относительное время
  • продвинутые парсеры

Это расширяет модель эквивалентности, но не нарушает базовую совместимость с Date, так как ядро Day.js покрывает основные операции работы с временем и датой.