Когда не нужен timeago.js

timeago.js решает конкретную задачу — отображение относительного времени. В ряде случаев задача решается проще, и добавление зависимости не оправдано.


Случай 1: Один язык и современные браузеры

Если приложение использует один язык и не поддерживает старые браузеры:

// Нет нужды в 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+.


Случай 2: Время отображается только на сервере

Если время форматируется на сервере (шаблонизаторы, SSR без гидрации):

# Python — момент генерации HTML
from datetime import datetime, timezone
from humanize import naturaltime

rendered_at = naturaltime(post.created_at)  # "5 минут назад"

timeago.js здесь избыточен — JavaScript вообще не нужен для форматирования.


Случай 3: Дата отображается как абсолютная

Если дизайн использует абсолютные даты, а не относительные:

✓ "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"

Никакой зависимости.


Случай 4: date-fns уже в проекте

Если date-fns используется для других нужд, добавлять timeago.js не нужно:

import { formatDistanceToNow } from 'date-fns';
import { ru } from 'date-fns/locale';

formatDistanceToNow(date, { locale: ru, addSuffix: true }); // "5 минут назад"

Случай 5: Даты только в email-рассылках

Для email-рассылок JavaScript не выполняется. Форматирование происходит на сервере в момент отправки. Добавлять timeago.js бессмысленно.


Случай 6: Приложение без публичного интерфейса

Внутренние 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)} дн. назад`;
}

Случай 7: Список с неизменными датами и кешированием

Если список постов кешируется на CDN и не обновляется после загрузки, таймеры render не нужны — достаточно одноразового format при генерации страницы.


Случай 8: Только временные метки в логах

Лог-интерфейсы часто показывают точные временные метки, а не “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

Относительное время здесь снижает точность.


Когда timeago.js нужен

  • Социальные ленты, комментарии, чаты — “2 минуты назад”.
  • Уведомления — “секунду назад”, с автоматическим обновлением.
  • Нужны кастомные локали или нестандартные формы.
  • Нужна поддержка Safari < 14 или IE11.
  • Нужна функция render для автоматического обновления DOM.

Матрица принятия решений

Условие Решение
Один язык + Chrome/Firefox/Safari 14+ Intl.RelativeTimeFormat
Несколько языков, живые обновления timeago.js
date-fns уже в проекте formatDistanceToNow
Абсолютные даты Intl.DateTimeFormat
Сервер рендерит HTML полностью Серверный humanize
IE11 / Safari 12 поддержка timeago.js с полифиллами