timeago.js решает конкретную задачу — отображение относительного времени. В ряде случаев задача решается проще, и добавление зависимости не оправдано.
Если приложение использует один язык и не поддерживает старые браузеры:
// Нет нужды в timeago.js — встроенный API браузера
const rtf = new Intl.RelativeTimeFormat('ru', { numeric: 'auto' });
function fromNow(date) {
const diffSec = (new Date(date) - Date.now()) / 1000;
// ... определить unit и вызвать rtf.format
}
Поддержка Intl.RelativeTimeFormat: Chrome 71+, Firefox
65+, Safari 14+, Node 12+.
Если время форматируется на сервере (шаблонизаторы, SSR без гидрации):
# Python — момент генерации HTML
from datetime import datetime, timezone
from humanize import naturaltime
rendered_at = naturaltime(post.created_at) # "5 минут назад"
timeago.js здесь избыточен — JavaScript вообще не нужен для форматирования.
Если дизайн использует абсолютные даты, а не относительные:
✓ "1 июня 2025, 12:00"
✗ "2 дня назад"
Для абсолютного форматирования:
new Date(date).toLocaleDateString('ru-RU', {
year: 'numeric',
month: 'long',
day: 'numeric',
hour: '2-digit',
minute: '2-digit',
});
// "1 июня 2025 г., 12:00"
Никакой зависимости.
Если date-fns используется для других нужд, добавлять timeago.js не нужно:
import { formatDistanceToNow } from 'date-fns';
import { ru } from 'date-fns/locale';
formatDistanceToNow(date, { locale: ru, addSuffix: true }); // "5 минут назад"
Для email-рассылок JavaScript не выполняется. Форматирование происходит на сервере в момент отправки. Добавлять timeago.js бессмысленно.
Внутренние admin-панели с небольшой аудиторией могут использовать простое решение:
// Без зависимостей — достаточно для 10 пользователей
const UNITS = [
[60, 'секунд'],
[3600, 'минут'],
[86400, 'часов'],
[Infinity, 'дней'],
];
function simple(date) {
const s = (Date.now() - new Date(date)) / 1000;
// Простейший вариант без хорошего склонения
if (s < 60) return 'только что';
if (s < 3600) return `${Math.floor(s / 60)} мин. назад`;
if (s < 86400)return `${Math.floor(s / 3600)} ч. назад`;
return `${Math.floor(s / 86400)} дн. назад`;
}
Если список постов кешируется на CDN и не обновляется после загрузки,
таймеры render не нужны — достаточно одноразового format
при генерации страницы.
Лог-интерфейсы часто показывают точные временные метки, а не “5 минут назад”:
2025-06-01 12:00:00 — Deployment started
2025-06-01 12:03:45 — Tests passed
2025-06-01 12:04:10 — Deployed to production
Относительное время здесь снижает точность.
render для автоматического обновления
DOM.| Условие | Решение |
|---|---|
| Один язык + Chrome/Firefox/Safari 14+ | Intl.RelativeTimeFormat |
| Несколько языков, живые обновления | timeago.js |
| date-fns уже в проекте | formatDistanceToNow |
| Абсолютные даты | Intl.DateTimeFormat |
| Сервер рендерит HTML полностью | Серверный humanize |
| IE11 / Safari 12 поддержка | timeago.js с полифиллами |