Библиотека строится вокруг неизменяемой (immutable) модели объекта даты. Любая операция над экземпляром не модифицирует исходное значение, а возвращает новый объект или примитив в зависимости от типа метода. Это фундаментальный принцип, определяющий поведение всех возвращаемых значений.
Ключевая особенность заключается в том, что результат метода всегда можно однозначно классифицировать:
Такое разделение упрощает предсказуемость API и снижает риск скрытых мутаций состояния.
Большинство методов возвращают новый объект Dayjs. Это обеспечивает возможность цепочек вызовов и гарантирует неизменность исходных данных.
Типичные методы, возвращающие экземпляр:
addsubtractstartOfendOfsetmillisecond, second, minute,
hour, date, month,
year (в сеттер-режиме)Каждый из этих методов создаёт новый объект:
const d1 = dayjs('2024-01-01');
const d2 = d1.add(1, 'day');
d1 !== d2;
Важное следствие: любые цепочки строятся на новых экземплярах, а не на изменении текущего состояния:
const result = dayjs('2024-01-01')
.add(2, 'day')
.subtract(1, 'month')
.startOf('day');
Каждый шаг возвращает новый Dayjs-объект, что делает поведение детерминированным.
Часть API предназначена для сериализации даты в текстовые представления. Эти методы всегда возвращают string, независимо от исходного состояния объекта.
format — основной метод преобразования даты в строку по
заданному шаблону:
dayjs('2024-01-01').format('YYYY-MM-DD');
Возвращаемое значение полностью зависит от шаблона и локали, но всегда является строкой.
Возвращает строковое представление в стандартном формате:
dayjs('2024-01-01').toString();
Результат аналогичен строковой сериализации даты, но не предназначен для форматирования интерфейса.
При подключении локалей некоторые методы форматирования также возвращают строки, адаптированные под язык:
Числовой тип используется для операций сравнения, вычисления времени и интероперабельности с Unix-таймстампами.
Возвращает timestamp в миллисекундах:
dayjs('2024-01-01').valueOf();
Эквивалентно Date.getTime().
Возвращает timestamp в секундах:
dayjs('2024-01-01').unix();
Разница между unix и valueOf
принципиальна:
valueOf → миллисекундыunix → секундыМетод вычисления разницы между датами возвращает число:
dayjs('2024-01-10').diff(dayjs('2024-01-01'), 'day');
Результат зависит от единицы измерения:
Возвращаемое значение всегда числовое, округление зависит от параметров.
Метод toDate обеспечивает интеграцию с нативным
JavaScript API:
dayjs('2024-01-01').toDate();
Результат — полноценный объект Date.
Особенность:
DateЭто важно при взаимодействии с API браузера, библиотеками и системными функциями, которые требуют нативный Date.
Некоторые методы предназначены для сравнения и проверки состояния. Они возвращают boolean.
dayjs('2024-01-01').isSame(dayjs('2024-01-01'), 'day');
dayjs('2024-01-01').isBefore('2024-02-01');
dayjs('2024-02-01').isAfter('2024-01-01');
Логические методы не изменяют объект и всегда работают в чистом функциональном стиле.
Цепочки в Day.js работают благодаря тому, что большинство методов возвращают экземпляр Dayjs.
Это создаёт единый поток преобразований:
dayjs()
.add(1, 'year')
.startOf('month')
.subtract(2, 'days')
.format('YYYY-MM-DD');
Финальный результат цепочки зависит от последнего метода:
Особенность Day.js заключается в смешении типов возврата в одном пространстве методов. Это требует строгого понимания категории каждого метода.
| Категория метода | Пример | Возвращаемое значение |
|---|---|---|
| Трансформация | add, subtract | Dayjs |
| Форматирование | format | string |
| Сравнение | isSame | boolean |
| Конвертация | toDate | Date |
| Вычисление | diff | number |
| Timestamp | unix, valueOf | number |
Такая модель делает API компактным, но строго типизированным по смыслу, а не по синтаксису.
Каждая операция, которая изменяет логическое состояние даты, возвращает новый экземпляр. Это исключает скрытые побочные эффекты.
const base = dayjs('2024-01-01');
const modified = base.add(10, 'day');
base.format('YYYY-MM-DD'); // 2024-01-01
modified.format('YYYY-MM-DD'); // 2024-01-11
Отсутствие мутации напрямую влияет на стратегию хранения значений: каждый результат операции должен быть явно сохранён при необходимости.
Плагины расширяют API, но не меняют базовую модель возвратов. Например:
fromNow) → stringДаже расширенные методы подчиняются тем же правилам: строка, число, объект, boolean или Date.
Day.js не выполняет неявных сложных преобразований типов. Любое преобразование явно выражено методом:
format → stringvalueOf → numbertoDate → DateЭто исключает неоднозначность при использовании операторов JavaScript.
Цепочки разрываются при первом методе, возвращающем примитив:
const result = dayjs()
.add(1, 'day')
.format('YYYY-MM-DD')
.add(1, 'day'); // ошибка: string не имеет метода add
Таким образом, тип возврата определяет границу дальнейших операций.
Система возвратов строится на трёх принципах:
Это делает поведение API устойчивым к композиции и позволяет строить сложные вычисления времени без потери контроля над типами данных.