Подключение функциональности относительного времени в Day.js
выполняется через плагин relativeTime, который расширяет
базовый API библиотеки методами для вычисления выражений вида «5 минут
назад» или «через 2 часа». Базовая установка Day.js не включает этот
функционал, поэтому предварительная активация плагина является
обязательной.
Подключение плагина выполняется через расширение экземпляра Day.js:
import dayjs from 'dayjs'
import relativeTime from 'dayjs/plugin/relativeTime'
dayjs.extend(relativeTime)
После подключения становятся доступны методы, связанные с вычислением относительных временных интервалов между датами.
Относительное время в Day.js строится на сравнении двух моментов:
Результат выражается в человекочитаемой форме:
Основные методы:
fromNow() — вычисление относительно текущего
моментаtoNow() — обратное направление относительно текущего
моментаfrom() — вычисление относительно указанной датыto() — вычисление до указанной датыМетод fromNow() возвращает строку, описывающую разницу
между текущим временем и датой объекта Day.js.
dayjs().subtract(5, 'minute').fromNow()
// "5 minutes ago"
Примеры поведения:
dayjs().subtract(1, 'hour').fromNow()
// "an hour ago"
dayjs().add(2, 'day').fromNow()
// "in 2 days"
Логика метода:
Метод toNow() инвертирует направление вычисления
относительно текущего времени.
dayjs().subtract(10, 'minute').toNow()
// "in 10 minutes"
Примеры:
dayjs().add(3, 'hour').toNow()
// "in 3 hours"
dayjs().subtract(1, 'year').toNow()
// "a year ago"
Фактически toNow() эквивалентен вызову
fromNow() с изменённой точкой зрения.
В отличие от fromNow() и toNow(), эти
методы позволяют задать произвольную точку отсчёта.
const a = dayjs('2024-01-01')
const b = dayjs('2024-01-10')
b.from(a)
// "9 days after"
Пример использования to():
a.to(b)
// "in 9 days"
Семантика:
from() — «относительно другой даты»to() — обратное направлениеDay.js автоматически выбирает наиболее подходящую единицу измерения:
Алгоритм основан на пороговых значениях, встроенных в локализацию. Например:
dayjs().subtract(45, 'second').fromNow()
// "a minute ago"
dayjs().subtract(21, 'day').fromNow()
// "21 days ago"
Переход между единицами происходит автоматически без ручной настройки.
Относительное время зависит от активной локали. Для корректного отображения требуется подключение локализационных данных.
import 'dayjs/locale/ru'
dayjs.locale('ru')
После этого строки становятся локализованными:
dayjs().subtract(5, 'minute').fromNow()
// "5 минут назад"
Локали определяют:
Плагин позволяет переопределять форматирование через локаль. Это
делается через объект relativeTime внутри конфигурации
языка.
Пример пользовательской локали:
dayjs.locale({
name: 'custom',
relativeTime: {
future: 'через %s',
past: '%s назад',
s: 'несколько секунд',
m: 'минута',
mm: '%d минут',
h: 'час',
hh: '%d часов',
d: 'день',
dd: '%d дней',
M: 'месяц',
MM: '%d месяцев',
y: 'год',
yy: '%d лет'
}
})
После установки такой конфигурации форматирование полностью контролируется разработчиком.
Day.js использует внутренние правила перехода между единицами, но поведение можно косвенно контролировать через локаль.
Например:
Эти границы фиксированы и зависят от реализации плагина, а не от пользовательской настройки.
Относительное время всегда округляется до ближайшей логичной единицы:
dayjs().subtract(1.7, 'hour').fromNow()
// "2 hours ago"
Правила округления:
Без подключения relativeTime методы отсутствуют:
dayjs().fromNow()
// TypeError: dayjs(...).fromNow is not a function
После подключения:
dayjs.extend(relativeTime)
dayjs().fromNow()
// корректный результат
При частом обновлении интерфейсов (например, ленты сообщений) относительное время требует периодического пересчёта:
setInterval(() => {
console.log(dayjs(message.date).fromNow())
}, 60000)
Типичный интервал обновления:
Относительное время одинаково корректно обрабатывает прошлое и будущее:
dayjs().add(7, 'day').fromNow()
// "in 7 days"
dayjs().add(7, 'day').toNow()
// "in 7 days"
Разница проявляется только в направлении сравнения.
Day.js преобразует даты в временные метки Unix и вычисляет разницу в миллисекундах:
Далее выполняется:
Относительное время часто используется совместно с:
utc — для унифицированного времениtimezone — для локальных временных зонcalendar — для календарных выражений («вчера в
14:00»)Пример связки:
import utc from 'dayjs/plugin/utc'
import timezone from 'dayjs/plugin/timezone'
dayjs.extend(utc)
dayjs.extend(timezone)
dayjs.extend(relativeTime)
Это позволяет получать корректные значения в распределённых системах.
Некорректные сценарии:
relativeTimeКаждая из этих ситуаций приводит к некорректному отображению или ошибкам выполнения.
При массовом использовании относительного времени важно учитывать:
В системах с большим количеством элементов предпочтительно: