Работа с относительным временем

Относительное время — основная задача timeago.js. Библиотека вычисляет разницу между двумя моментами и выражает её в человекочитаемом виде. Эта концепция шире, чем простое “X минут назад” — она включает опорные точки, направленность (прошлое/будущее) и контекстную интерпретацию.


Что такое относительное время

Абсолютное время: 2025-05-26T10:00:00Z

Относительное время (от текущего момента):

4 часа назад
1 день назад
5 минут назад
через 3 дня

Относительное время не сообщает точный момент — оно даёт ответ на вопрос “как давно?” или “как скоро?”.


Вычисление относительного времени

Базовая формула:

const diff = now - target; // отрицательное = будущее

timeago.js реализует это внутри:

import { format } from 'timeago.js';

const now     = Date.now();
const past    = now - 1000 * 60 * 30; // 30 минут назад
const future  = now + 1000 * 60 * 30; // через 30 минут

format(past,   'ru'); // → "30 минут назад"
format(future, 'ru'); // → "через 30 минут"

Относительное время с кастомной опорной точкой

По умолчанию опорная точка — Date.now(). Функция format принимает третий аргумент:

import { format } from 'timeago.js';

const base   = new Date('2025-06-01T00:00:00Z');
const target = new Date('2025-05-28T00:00:00Z');

format(target, 'ru', { relativeDate: base });
// → "4 дня назад"

Это позволяет вычислять относительное время между двумя произвольными моментами.


Относительное время от фиксированной точки

Например, “сколько прошло с начала спринта”:

const sprintStart = new Date('2025-05-19T09:00:00Z');
const eventTime   = new Date('2025-05-26T14:00:00Z');

format(eventTime, 'ru', { relativeDate: sprintStart });
// вычислит разницу от sprintStart до eventTime

Если relativeDate новее target, результат будет в прошлом; если старее — в будущем.


Относительное время в прошлом

import { format } from 'timeago.js';

// Разные интервалы прошлого
format(Date.now() - 1000 * 20,          'ru'); // → "только что"
format(Date.now() - 1000 * 60,          'ru'); // → "1 минуту назад"
format(Date.now() - 1000 * 60 * 90,     'ru'); // → "1 час назад"
format(Date.now() - 1000 * 60 * 60 * 25,'ru'); // → "1 день назад"
format(Date.now() - 1000 * 60 * 60 * 24 * 8, 'ru'); // → "1 неделю назад"

Относительное время в будущем

format(Date.now() + 1000 * 60,            'ru'); // → "через 1 минуту"
format(Date.now() + 1000 * 60 * 60 * 3,   'ru'); // → "через 3 часа"
format(Date.now() + 1000 * 60 * 60 * 24,  'ru'); // → "через 1 день"
format(Date.now() + 1000 * 60 * 60 * 24 * 30, 'ru'); // → "через 1 месяц"

Смешанный список прошлых и будущих дат

import { format } from 'timeago.js';

const events = [
  { title: 'Прошедшая встреча', date: new Date(Date.now() - 1000 * 60 * 60 * 2) },
  { title: 'Текущий момент',    date: new Date() },
  { title: 'Дедлайн',          date: new Date(Date.now() + 1000 * 60 * 60 * 48) },
];

events.forEach(e => {
  console.log(`${e.title}: ${format(e.date, 'ru')}`);
});

Вывод:

Прошедшая встреча: 2 часа назад
Текущий момент: только что
Дедлайн: через 2 дня

Детерминированное относительное время в тестах

const fixedNow = new Date('2025-05-26T12:00:00Z');

const cases = [
  { input: '2025-05-26T11:00:00Z', expected: '1 час назад' },
  { input: '2025-05-26T10:00:00Z', expected: '2 часа назад' },
  { input: '2025-05-27T12:00:00Z', expected: 'через 1 день' },
];

cases.forEach(({ input, expected }) => {
  const result = format(input, 'ru', { relativeDate: fixedNow });
  console.assert(result === expected, `${input}: expected "${expected}", got "${result}"`);
});

Граничные случаи

Текущий момент:

format(Date.now()); // → "just now" / "только что"

Очень далёкое прошлое:

format(new Date(0), 'ru'); // → "55 лет назад" (зависит от текущего года)

Будущее через 100 лет:

format(new Date(Date.now() + 1000 * 60 * 60 * 24 * 365 * 100), 'ru');
// → "через 100 лет"

Относительное время и UX

Относительный формат времени улучшает восприятие интерфейса:

  • “5 минут назад” воспринимается быстрее, чем “2025-05-26T12:35:00Z”
  • Он ситуативен — пользователь получает информацию о свежести контента
  • Будущее время (“через 2 дня”) создаёт ощущение срочности или ожидания

Этот формат особенно эффективен для:

  • уведомлений;
  • дат публикаций в лентах;
  • комментариев;
  • статусов задач и дедлайнов.