Day.js работает по принципу immutable-объектов: каждое преобразование даты возвращает новый экземпляр, не изменяя исходный.
Это критически важно при работе с прошлым и будущим, так как позволяет строить цепочки вычислений без побочных эффектов.
import dayjs from 'dayjs';
const now = dayjs();
const later = now.add(2, 'day');
console.log(now.format());
console.log(later.format());
now остаётся неизменным, а результат смещения хранится
отдельно.
Основной механизм работы с будущим и прошлым — методы
add и subtract.
dayjs().add(10, 'minute');
dayjs().add(3, 'hour');
dayjs().add(1, 'day');
dayjs().add(2, 'week');
dayjs().add(1, 'month');
dayjs().add(5, 'year');
Метод принимает:
Поддерживаемые единицы:
millisecondsecondminutehourdayweekmonthyeardayjs().subtract(15, 'minute');
dayjs().subtract(7, 'day');
dayjs().subtract(1, 'month');
Математически subtract(x, unit) эквивалентен
add(-x, unit).
При анализе прошлого и будущего часто требуется нормализация до начала или конца временного интервала.
dayjs().startOf('day');
dayjs().startOf('month');
dayjs().startOf('year');
Пример:
const start = dayjs().startOf('day');
console.log(start.format());
Результат: текущая дата с временем 00:00:00.000.
dayjs().endOf('day');
dayjs().endOf('month');
dayjs().endOf('year');
Пример:
const end = dayjs().endOf('month');
console.log(end.format());
Результат: последний момент месяца 23:59:59.999.
Для анализа временных отношений используются методы сравнения:
isBeforeisAfterisSamedayjs('2024-01-01').isBefore(dayjs());
dayjs('2030-01-01').isAfter(dayjs());
dayjs('2024-01-01').isSame('2024-01-01', 'day');
dayjs().isSame(dayjs(), 'second');
Точность сравнения задаётся вторым аргументом:
yearmonthdayhourminutesecondМетод diff позволяет вычислять расстояние между
моментами времени, что является ключевым инструментом анализа прошлого и
будущего.
const a = dayjs('2024-01-01');
const b = dayjs('2024-01-10');
b.diff(a, 'day'); // 9
Можно менять единицы измерения:
b.diff(a, 'hour');
b.diff(a, 'month');
b.diff(a, 'year');
Также поддерживается дробный результат:
b.diff(a, 'day', true); // 9.0 или 9.3 в зависимости от данных
Для человекочитаемого представления используется плагин
relativeTime.
import relativeTime from 'dayjs/plugin/relativeTime';
dayjs.extend(relativeTime);
После подключения:
dayjs().from(dayjs().subtract(5, 'minute')); // "5 minutes ago"
dayjs().to(dayjs().add(2, 'hour')); // "in 2 hours"
Также:
dayjs().fromNow(); // относительно текущего момента (прошлое)
dayjs().toNow(); // относительно текущего момента (будущее)
Работа с будущим и прошлым часто сводится к созданию диапазонов.
const start = dayjs().subtract(7, 'day');
const end = dayjs();
const inLastWeek = (date) =>
dayjs(date).isAfter(start) && dayjs(date).isBefore(end);
const start = dayjs();
const end = dayjs().add(30, 'day');
const inNextMonth = (date) =>
dayjs(date).isAfter(start) && dayjs(date).isBefore(end);
При расчётах будущих значений важно учитывать автоматическую коррекцию календаря.
dayjs('2024-01-31').add(1, 'month');
Результат может отличаться в зависимости от длины месяца, например:
Такая особенность связана с календарной логикой, а не арифметикой.
Day.js позволяет строить последовательные трансформации:
const result = dayjs()
.add(2, 'day')
.subtract(3, 'hour')
.startOf('hour')
.add(15, 'minute');
console.log(result.format());
Каждый шаг создаёт новый объект, формируя предсказуемую цепочку.
const deadline = dayjs('2026-06-01');
if (dayjs().isAfter(deadline)) {
// срок в прошлом
}
if (dayjs().isBefore(deadline)) {
// срок в будущем
}
Типичный сценарий — расчёт оставшегося времени:
const event = dayjs('2026-06-10');
const daysLeft = event.diff(dayjs(), 'day');
const hoursLeft = event.diff(dayjs(), 'hour');
При этом выбор единицы влияет на точность результата.
diff всегда возвращает усечённое значение при целых
единицах:
dayjs('2026-01-01 12:00').diff('2026-01-01 00:00', 'day'); // 0
Для получения более точной оценки используется третий параметр:
dayjs('2026-01-01 12:00').diff('2026-01-01 00:00', 'day', true); // 0.5
Последовательности будущих или прошедших дат формируются через цикл с
add/subtract.
const timeline = [];
for (let i = 0; i < 5; i++) {
timeline.push(dayjs().add(i, 'day'));
}
Результат — массив объектов, представляющих будущие дни.
Пример фильтрации событий по диапазону:
const events = [
{ date: '2026-05-20' },
{ date: '2026-05-25' },
{ date: '2026-06-01' }
];
const start = dayjs().subtract(3, 'day');
const end = dayjs().add(10, 'day');
const filtered = events.filter(e => {
const d = dayjs(e.date);
return d.isAfter(start) && d.isBefore(end);
});
Планирование задач часто строится на фиксированных смещениях:
const reminder = dayjs().add(45, 'minute');
const retry = dayjs().add(2, 'hour');
const backup = dayjs().add(1, 'day');
Такие конструкции используются в:
Сложные сценарии требуют аккуратного порядка операций:
const result = dayjs()
.startOf('day')
.add(1, 'day')
.subtract(1, 'second');
Здесь важно, что каждая операция опирается на результат предыдущей, формируя точное временное окно.
При работе с прошлым часто требуется нормализовать данные:
const birth = dayjs('1990-05-15');
const age = dayjs().diff(birth, 'year');
Такой подход обеспечивает стабильность вычислений независимо от текущей даты.