Функция format в timeago.js принимает несколько типов
входных данных для представления даты. Это позволяет использовать
библиотеку с любыми источниками данных без дополнительного
преобразования.
| Тип | Пример |
|---|---|
number |
1716720000000 (timestamp в мс) |
Date |
new Date('2025-05-26') |
string |
'2025-05-26T10:00:00Z' |
Наиболее точный и однозначный формат:
import { format } from 'timeago.js';
// Текущее время минус 10 минут
const ts = Date.now() - 1000 * 60 * 10;
format(ts);
// → "10 minutes ago"
Unix timestamp в секундах необходимо конвертировать в миллисекунды:
const unixSeconds = 1716720000;
format(unixSeconds * 1000);
const date = new Date('2025-05-26T08:00:00Z');
format(date, 'ru');
// → "4 часа назад"
Объект Date — наиболее типобезопасный вариант при работе
с TypeScript. Именно этот формат рекомендуется использовать в строго
типизированных проектах.
Строки передаются напрямую в конструктор Date через
new Date(str). Это означает, что поддерживаются все
форматы, которые корректно парсятся браузером или Node.js.
ISO 8601:
format('2025-05-26T10:00:00Z');
format('2025-05-26T10:00:00+03:00');
format('2025-05-26');
RFC 2822:
format('Mon, 26 May 2025 10:00:00 +0000');
| Формат строки | Поведение |
|---|---|
'2025-05-26T10:00:00Z' |
Корректно, UTC |
'2025-05-26T10:00:00' |
Зависит от реализации браузера |
'2025-05-26' |
В браузерах — полночь UTC |
'26.05.2025' |
Не стандартизировано, риск ошибки |
'May 26 2025' |
Работает в большинстве браузеров |
'invalid string' |
NaN — неправильный вывод |
format('26/05/2025');
// Поведение не определено — в разных браузерах результат разный
Безопасный подход — всегда использовать ISO 8601 или объект
Date:
// Безопасно
format(new Date(2025, 4, 26)); // месяц с 0
// Или
format('2025-05-26T00:00:00Z');
API чаще всего возвращают строки:
{
"createdAt": "2025-05-26T08:30:00.000Z"
}
Эту строку можно передать в format напрямую:
const { createdAt } = apiResponse;
format(createdAt, 'ru');
Или с явным преобразованием для надёжности:
format(new Date(createdAt), 'ru');
Даты из базы данных часто приходят как строки в формате MySQL или PostgreSQL:
// MySQL: "2025-05-26 10:00:00"
format(new Date('2025-05-26 10:00:00'.replace(' ', 'T') + 'Z'), 'ru');
Прямая передача "2025-05-26 10:00:00" может дать
неверный результат из-за неоднозначности часового пояса.
Библиотека не защищена от null или
undefined — такие значения вызовут ошибку или вернут
некорректный результат:
format(null); // Ошибка или "NaN years ago"
format(undefined); // Аналогично
Защитная обёртка:
function safeFormat(date, locale = 'ru') {
if (!date) return '';
return format(date, locale);
}
Если в проекте используется Moment.js, его объекты не поддерживаются напрямую. Нужно конвертировать:
import moment from 'moment';
import { format } from 'timeago.js';
const m = moment('2025-05-26');
format(m.toDate(), 'ru');
import dayjs from 'dayjs';
import { format } from 'timeago.js';
const d = dayjs('2025-05-26');
format(d.toDate(), 'ru');
const unixTimestamp = 1748260800; // секунды
format(unixTimestamp * 1000, 'ru');
Умножение на 1000 — стандартное преобразование из секунд в миллисекунды.
При использовании render() библиотека самостоятельно
считывает атрибут datetime:
<time datetime="2025-05-26T10:00:00Z"></time>
Значение атрибута обрабатывается так же, как строковый аргумент в
format. Поэтому рекомендуется использовать ISO 8601 в
datetime.
Date — если дата уже создана через
new Date() или пришла из стандартного API.number (timestamp в мс) — если работа
ведётся с Date.now() или результатами арифметики.