Как показать, сколько времени прошло
Короткий ответ
Intl.RelativeTimeFormat превращает число и единицу во фразу на нужном языке. Отрицательные числа означают прошлое:
const rtf = new Intl.RelativeTimeFormat('en', { numeric: 'auto' });
console.log(rtf.format(-5, 'minute'));
console.log(rtf.format(2, 'day'));
console.log(rtf.format(-1, 'day'));Результат:
5 minutes ago
in 2 days
yesterdayВыбор единицы
Посчитайте разницу в секундах и выберите самую крупную подходящую единицу:
const units = [
['year', 31536000],
['month', 2592000],
['day', 86400],
['hour', 3600],
['minute', 60],
['second', 1],
];
const timeAgo = (date, now = new Date()) => {
const seconds = Math.round((date - now) / 1000);
const rtf = new Intl.RelativeTimeFormat('en', { numeric: 'auto' });
for (const [unit, size] of units) {
if (Math.abs(seconds) >= size || unit === 'second') {
return rtf.format(Math.round(seconds / size), unit);
}
}
};
const now = new Date(2025, 5, 10, 12, 0);
console.log(timeAgo(new Date(2025, 5, 10, 11, 45), now));
console.log(timeAgo(new Date(2025, 5, 7, 12, 0), now));
console.log(timeAgo(new Date(2025, 5, 10, 15, 0), now));Результат:
15 minutes ago
3 days ago
in 3 hoursЧастая ошибка
Строить фразы назад и через вручную быстро становится сложно в других языках, где форма слова зависит от числа. Доверьте это Intl:
const rtf = new Intl.RelativeTimeFormat('ru');
console.log(rtf.format(-1, 'hour'), '|', rtf.format(-3, 'hour'), '|', rtf.format(-5, 'hour'));Результат:
1 час назад | 3 часа назад | 5 часов назадФункции из этого ответа
- Intl.RelativeTimeFormat — Форматирует относительное время: «3 дня назад», «через час».