Encodera

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.

Как показать, сколько времени прошло

Короткий ответ

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 дня назад», «через час».

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.