Форматирование относительного времени — распространённая задача во frontend-разработке. Интерфейсы социальных сетей, мессенджеров, административных панелей и систем уведомлений часто отображают время в виде:
Для решения этой задачи существует множество библиотек. Среди наиболее известных:
Каждая из них предлагает собственный подход к форматированию дат и работе со временем.
Главная особенность timeago.js — узкая специализация. Библиотека сосредоточена исключительно на отображении относительного времени.
Пример:
import { format } from 'timeago.js'
format('2025-05-20')
// 6 days ago
В отличие от универсальных библиотек, timeago.js:
Moment.js — одна из самых известных библиотек для работы с датами в JavaScript. Она предоставляет:
Пример в Moment.js:
moment("2025-05-20").fromNow()
Пример в timeago.js:
format("2025-05-20")
timeago.js значительно проще.
Одно из главных преимуществ timeago.js — компактность.
Moment.js считается тяжёлой библиотекой:
timeago.js:
Для современных frontend-приложений это критически важно.
Moment.js создаёт объекты-обёртки над датами:
const date = moment()
timeago.js работает проще:
format(Date.now())
Из-за этого:
Особенно заметна разница при массовом рендеринге:
Moment.js официально считается legacy-проектом. Команда библиотеки рекомендует использовать более современные решения.
timeago.js продолжает активно использоваться благодаря:
Day.js создавался как лёгкая альтернатива Moment.js.
По стилю API библиотеки очень похожи:
dayjs().fromNow()
Для поддержки относительного времени требуется подключение плагина:
import relativeTime from 'dayjs/plugin/relativeTime'
timeago.js не требует дополнительных модулей для базовой задачи.
import dayjs from 'dayjs'
import relativeTime from 'dayjs/plugin/relativeTime'
dayjs.extend(relativeTime)
import { format } from 'timeago.js'
Подход timeago.js проще и короче.
Day.js предоставляет больше возможностей:
timeago.js ограничен только относительным временем.
Это одновременно:
Для компонентов вида:
timeago.js часто оказывается удобнее из-за минимального API.
date-fns использует функциональный подход.
Пример:
import { formatDistanceToNow } from 'date-fns'
formatDistanceToNow(new Date())
В timeago.js:
format(new Date())
date-fns построен на отдельных функциях:
import addDays from 'date-fns/addDays'
Такой подход:
timeago.js идёт ещё дальше — библиотека уже изначально содержит только один основной сценарий.
date-fns предоставляет больше контроля:
formatDistanceToNow(date, {
addSuffix: true
})
Можно настраивать:
В timeago.js настройки проще.
date-fns содержит большое количество функций:
timeago.js изучается буквально за несколько минут.
Luxon ориентирован на сложную работу с датами:
Пример:
DateTime.now().toRelative()
Luxon значительно сложнее:
DateTime
.fromISO('2025-05-20')
.setZone('Asia/Almaty')
.toRelative()
timeago.js:
format('2025-05-20')
Разница особенно заметна в небольших проектах.
Luxon лучше подходит для:
timeago.js эффективнее для:
| Библиотека | Размер | Назначение | Сложность |
|---|---|---|---|
| timeago.js | Очень маленький | Relative time | Низкая |
| Moment.js | Большой | Универсальная работа с датами | Средняя |
| Day.js | Маленький | Универсальная работа с датами | Низкая |
| date-fns | Средний | Функциональная работа с датами | Средняя |
| Luxon | Средний/большой | Timezone и сложные даты | Высокая |
format(date)
moment(date).fromNow()
dayjs(date).fromNow()
formatDistanceToNow(date)
DateTime.fromISO(date).toRelative()
Поддерживает большое количество языков:
format(date, 'ru')
Регистрация кастомной локали:
register('custom', localeFunc)
Локализация встроена:
moment.locale('ru')
Однако многие локали увеличивают размер bundle.
Использует подключаемые локали:
import 'dayjs/locale/ru'
Локали импортируются отдельно:
import { ru } from 'date-fns/locale'
Основан на возможностях Intl API браузера.
Одно из важных преимуществ timeago.js — автоматическое обновление текста времени.
render(nodes)
Библиотека самостоятельно:
Большинство альтернатив требуют ручного обновления интерфейса.
format(date)
dayjs(date).fromNow()
formatDistanceToNow(date)
Все варианты подходят для React, однако timeago.js выигрывает минимализмом.
timeago.js часто используют в computed-свойствах:
computed(() => format(date))
Подключение возможно через pipes или сервисы.
timeago.js особенно эффективен в следующих случаях:
Подходит для поддержки старых проектов.
Хороший выбор для универсальной замены Moment.js.
Оптимален для функционального подхода и сложных вычислений.
Подходит для enterprise-систем и timezone-логики.
Философия:
Философия:
Философия:
Философия:
import { format } from 'timeago.js'
console.log(format(Date.now() - 1000 * 60 * 5))
import dayjs from 'dayjs'
import relativeTime from 'dayjs/plugin/relativeTime'
dayjs.extend(relativeTime)
console.log(dayjs().subtract(5, 'minute').fromNow())
import { subMinutes, formatDistanceToNow } from 'date-fns'
const date = subMinutes(new Date(), 5)
console.log(
formatDistanceToNow(date, {
addSuffix: true
})
)
import { DateTime } from 'luxon'
console.log(
DateTime.now()
.minus({ minutes: 5 })
.toRelative()
)
Большинство задач решается одной функцией:
format()
Подключение занимает несколько строк.
Библиотека легко изучается даже начинающими разработчиками.
Особенно заметна в интерфейсах с большим количеством дат.
timeago.js хорошо сочетается с:
Библиотека не умеет:
Нет встроенных инструментов:
addDays()
differenceInHours()
startOfMonth()
Во многих проектах timeago.js используется совместно с:
timeago.js отвечает только за отображение relative time, а остальные библиотеки — за вычисления и обработку дат.