timeago.js — компактная Javascript-библиотека для
преобразования даты и времени в человекочитаемый относительный формат.
Вместо точного времени вроде:
2025-05-26T10:30:00Z
библиотека позволяет выводить:
5 минут назад
2 часа назад
только что
через 3 дня
Подобный формат активно используется в:
Главная задача timeago.js — автоматическое вычисление
временной разницы между текущим моментом и указанной датой с последующим
выводом удобной текстовой формы.
Библиотека автоматически вычисляет:
Пример:
import { format } from 'timeago.js';
format('2025-05-26 12:00:00');
Результат:
3 часа назад
timeago.js работает не только с прошедшими
событиями.
Пример:
format('2025-06-01');
Результат:
через 5 дней
Это удобно для:
Библиотека умеет самостоятельно обновлять отображение времени в DOM.
Например:
1 минуту назад
через некоторое время автоматически станет:
2 минуты назад
без ручного обновления страницы.
timeago.js поддерживает множество языков:
Можно создавать собственные локали.
Библиотека очень лёгкая и не перегружает приложение. Это важно для:
npm install timeago.js
yarn add timeago.js
<script src="https://unpkg.com/timeago.js/dist/timeago.min.js"></script>
timeago.js строится вокруг нескольких основных
функций:
| Функция | Назначение |
|---|---|
format() |
Форматирование даты |
render() |
Автоматическое обновление DOM |
cancel() |
Остановка обновления |
register() |
Регистрация локали |
import { format } from 'timeago.js';
const result = format('2025-05-26 14:00:00');
console.log(result);
Результат:
2 часа назад
Функция поддерживает:
format('2025-05-26');
format(Date.now() - 1000 * 60);
format(new Date());
Библиотека:
Например:
format(Date.now() - 3000);
Разница:
3 секунды
Результат:
3 секунды назад
timeago.js автоматически переключается между единицами
времени.
только что
10 секунд назад
1 минуту назад
15 минут назад
2 часа назад
12 часов назад
1 день назад
5 дней назад
2 недели назад
3 месяца назад
2 года назад
import { format } from 'timeago.js';
format('2025-05-26', 'ru');
format('2025-05-26', 'en_US');
Функция render() используется для автоматического
обновления времени внутри HTML-элементов.
<div class="time" datetime="2025-05-26T10:00:00"></div>
import { render } from 'timeago.js';
const nodes = document.querySelectorAll('.time');
render(nodes, 'ru');
Функция:
datetime;После запуска:
render(nodes);
обновление времени происходит автоматически через внутренние таймеры.
Например:
59 секунд назад
через секунду станет:
1 минуту назад
const node = document.querySelector('.time');
render(node);
const items = document.querySelectorAll('.time');
render(items);
Иногда требуется прекратить автоматическое обновление.
Пример:
import { cancel } from 'timeago.js';
cancel();
Это особенно важно:
import { format } from 'timeago.js';
function Post({ createdAt }) {
return (
<span>
{format(createdAt, 'ru')}
</span>
);
}
import { useEffect, useRef } from 'react';
import { render, cancel } from 'timeago.js';
function Time({ date }) {
const ref = useRef();
useEffect(() => {
render(ref.current, 'ru');
return () => cancel(ref.current);
}, []);
return (
<time ref={ref} datetime={date}></time>
);
}
<template>
<time ref="time" :datetime="date"></time>
</template>
<script setup>
import { onMounted, onBeforeUnmount, ref } from 'vue';
import { render, cancel } from 'timeago.js';
const props = defineProps({
date: String
});
const time = ref(null);
onMounted(() => {
render(time.value, 'ru');
});
onBeforeUnmount(() => {
cancel(time.value);
});
</script>
import { format } from 'timeago.js';
export class AppComponent {
createdAt = format('2025-05-26');
}
Библиотека позволяет полностью переопределять правила отображения времени.
import { register } from 'timeago.js';
register('custom', (number, index) => {
return [
['только что', 'прямо сейчас'],
['%s секунд назад', 'через %s секунд'],
['1 минуту назад', 'через 1 минуту'],
['%s минут назад', 'через %s минут']
][index];
});
format(Date.now() - 10000, 'custom');
Функция локали получает:
| Аргумент | Назначение |
|---|---|
number |
Количество единиц времени |
index |
Индекс временного интервала |
| Индекс | Интервал |
|---|---|
| 0 | Сейчас |
| 1 | Секунды |
| 2 | 1 минута |
| 3 | Минуты |
| 4 | 1 час |
| 5 | Часы |
| 6 | 1 день |
| 7 | Дни |
| 8 | 1 неделя |
| 9 | Недели |
| 10 | 1 месяц |
| 11 | Месяцы |
| 12 | 1 год |
| 13 | Годы |
timeago.js корректно работает с ISO 8601.
Пример:
format('2025-05-26T12:00:00Z');
format(1716720000000);
Библиотека использует встроенные механизмы Javascript
Date.
Следовательно:
При серверном рендеринге:
Поэтому render() обычно запускают только на клиенте.
Если на странице сотни элементов времени:
<time></time>
<time></time>
<time></time>
каждый может обновляться отдельно.
Обновлять только видимые элементы.
Особенно важно для:
cancel(node);
при удалении элемента из DOM.
5 минут назад
2 часа назад
только что
1 секунду назад
был в сети 3 минуты назад
Современный Javascript имеет встроенный API:
Intl.RelativeTimeFormat
Однако timeago.js:
| Возможность | timeago.js | Intl.RelativeTimeFormat |
|---|---|---|
| Автоматический расчёт | Да | Нет |
| DOM-обновление | Да | Нет |
| Готовые локали | Да | Частично |
| Простота использования | Высокая | Средняя |
| Размер | Очень маленький | Встроен в браузер |
Moment.js значительно тяжелее и предназначен для
комплексной работы с датами.
timeago.js решает только одну задачу:
relative time formatting
За счёт этого библиотека:
Подходит для production-сборок.
Всего несколько основных функций.
Не требуется писать собственные таймеры.
Можно легко создавать свои переводы.
Редкая возможность среди библиотек форматирования времени.
Нет:
Для сложных правил может потребоваться собственная локаль.
Все ограничения объекта Date Javascript сохраняются.
Библиотека особенно полезна:
Библиотека плохо подходит для:
В подобных случаях обычно используют:
date-fns;Luxon;Day.js;Temporal;Moment.js (в legacy-проектах).Библиотека:
Date.now().<time class="post-time" datetime="2025-05-26T10:00:00"></time>
import { render } from 'timeago.js';
const elements = document.querySelectorAll('.post-time');
render(elements, 'ru');
3 часа назад
с автоматическим обновлением без перезагрузки страницы.