Относительное время — основная задача 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 лет"
Относительный формат времени улучшает восприятие интерфейса:
Этот формат особенно эффективен для: