Гуманизация временных интервалов

Числовое представление времени в формате абсолютных дат редко подходит для интерфейсов, ориентированных на человека. Значения вида 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()

Метод 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

Методы 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 учитывает это через локали, где правила задаются функциями или таблицами склонений.

Пример логики:

  • 1 минута
  • 2–4 минуты
  • 5+ минут

Такие правила применяются автоматически при корректной локали, но могут быть переопределены для специфических языковых моделей.


Интеграция с пользовательскими форматами отображения

Гуманизированные интервалы часто комбинируются с кастомными шаблонами интерфейса:

function formatEventTime(date) {
  const d = dayjs(date);

  return `${d.fromNow()} (${d.format('HH:mm')})`;
}

Такой подход объединяет относительное восприятие и точное время суток.


Ограничения относительного времени

Гуманизация временных интервалов в Day.js имеет ряд особенностей:

  • отсутствует автоматическое обновление значения
  • не учитываются бизнес-правила (например, «рабочие дни»)
  • точность ограничена дискретными единицами времени
  • локализация требует явного подключения и настройки

Несмотря на это, механизм остаётся базовым инструментом для построения интерфейсов с естественным восприятием времени.