Числовое представление времени в формате абсолютных дат редко
подходит для интерфейсов, ориентированных на человека. Значения вида
2026-05-22T14:03:00Z или 1716373380 требуют
дополнительного преобразования, чтобы стать понятными: «5 минут назад»,
«через 2 часа», «3 дня назад». В Day.js подобное преобразование
реализуется через плагин относительного времени и механизм локализации
строк.
Функциональность гуманизации интервалов в Day.js не входит в ядро
библиотеки и подключается отдельно через плагин
relativeTime.
import dayjs from 'dayjs';
import relativeTime from 'dayjs/plugin/relativeTime';
dayjs.extend(relativeTime);
После подключения становятся доступны методы:
fromNow() — выражение времени относительно текущего
моментаfrom() — выражение относительно другой датыtoNow() — обратное направление относительно текущего
моментаto() — обратное направление относительно указанной
датыМетод fromNow() преобразует дату в человекочитаемую
форму относительно текущего времени.
dayjs().subtract(5, 'minute').fromNow(); // "5 minutes ago"
dayjs().add(2, 'hour').fromNow(); // "in 2 hours"
dayjs().subtract(3, 'day').fromNow(); // "3 days ago"
Механизм основан на сравнении текущего времени с целевой меткой и выборе подходящей единицы измерения: секунды, минуты, часы, дни и т.д.
Методы from() и to() позволяют задавать
базовую точку сравнения, отличную от текущего времени.
const now = dayjs();
const past = dayjs().subtract(10, 'day');
past.from(now); // "10 days ago"
const future = dayjs().add(3, 'day');
future.to(now); // "in 3 days"
Разница между fromNow() и from()
заключается в явном указании точки отсчёта, что критично при анализе
временных последовательностей событий.
Гуманизация не ограничивается текущим моментом. Сравнение двух произвольных дат позволяет строить описания временных промежутков.
const start = dayjs('2026-01-01');
const end = dayjs('2026-01-10');
end.from(start); // "9 days after"
Подобная форма используется при отображении логов, истории изменений и событийных потоков.
По умолчанию Day.js использует английские строки. Для изменения языка подключается локаль.
import 'dayjs/locale/ru';
dayjs.locale('ru');
После установки локали форматирование автоматически переключается:
dayjs().subtract(1, 'minute').fromNow(); // "минуту назад"
dayjs().add(1, 'hour').fromNow(); // "через час"
Каждая локаль содержит набор правил склонения и грамматических форм для единиц времени.
Стандартные строки можно изменить через updateLocale,
что особенно важно при адаптации интерфейсов под специфическую
терминологию.
import updateLocale from 'dayjs/plugin/updateLocale';
dayjs.extend(updateLocale);
dayjs.updateLocale('ru', {
relativeTime: {
future: 'через %s',
past: '%s назад',
s: 'несколько секунд',
m: 'минуту',
mm: '%d минут',
h: 'час',
hh: '%d часов',
d: 'день',
dd: '%d дней',
M: 'месяц',
MM: '%d месяцев',
y: 'год',
yy: '%d лет'
}
});
Такой механизм позволяет адаптировать тексты под UX-требования продукта, включая сокращения, тональность и доменные формулировки.
Day.js автоматически выбирает наиболее подходящую единицу времени. Например, 90 секунд может быть интерпретировано как «2 минуты». Поведение зависит от внутренней логики округления.
Для контроля точности используется параметр threshold
(через дополнительные плагины или кастомные решения), однако в
стандартной конфигурации управление ограничено.
Практический подход заключается в выборе конкретных единиц при вычислениях до передачи в Day.js:
dayjs().diff(dayjs().subtract(90, 'second'), 'second'); // 90
Гуманизированные интервалы не заменяют абсолютные даты, а дополняют их. В интерфейсах часто используется комбинированный вывод:
const date = dayjs('2026-05-20');
date.format('YYYY-MM-DD'); // "2026-05-20"
date.fromNow(); // "2 days ago"
Абсолютная форма обеспечивает точность, относительная — восприятие масштаба времени.
Для отображения длительных промежутков между событиями применяется
diff, а затем результат преобразуется в человекочитаемую
форму.
const a = dayjs('2026-01-01');
const b = dayjs('2026-02-15');
const days = b.diff(a, 'day'); // 45
Дальнейшая гуманизация выполняется вручную через логику приложения или через комбинацию единиц измерения:
Гуманизация в Day.js не является реактивной. Значения вычисляются в момент вызова метода. При изменении текущего времени повторный вызов возвращает новое значение.
const timestamp = dayjs().subtract(10, 'minute');
timestamp.fromNow(); // "10 minutes ago"
При использовании в интерфейсах реального времени требуется периодическое обновление отображения.
В некоторых языках форма слова зависит от числа и контекста. Day.js учитывает это через локали, где правила задаются функциями или таблицами склонений.
Пример логики:
Такие правила применяются автоматически при корректной локали, но могут быть переопределены для специфических языковых моделей.
Гуманизированные интервалы часто комбинируются с кастомными шаблонами интерфейса:
function formatEventTime(date) {
const d = dayjs(date);
return `${d.fromNow()} (${d.format('HH:mm')})`;
}
Такой подход объединяет относительное восприятие и точное время суток.
Гуманизация временных интервалов в Day.js имеет ряд особенностей:
Несмотря на это, механизм остаётся базовым инструментом для построения интерфейсов с естественным восприятием времени.