JavaScript | Intl.RelativeTimeFormat を使って分・時間・月など、さまざまな単位で相対時間を表示する方法

javascrpit JavaScript
スポンサーリンク

では「一定期間を過ぎたら相対表現ではなく日付だけを表示する」方法を作ってみましょう。
たとえば 30日以上前なら「2025/09/20」 のように絶対日付に切り替えるイメージです。


ゴール

  • 直近 → 「◯分前」「◯時間前」「昨日」「◯日前」など相対表現
  • 30日以上前 → 「YYYY/MM/DD HH:mm」のような絶対日付

実装例

function timeAgoOrDate(date, lang = 'ja', thresholdDays = 30) {
  const now = new Date();
  const diffMs = now - date;
  const diffSec = Math.floor(diffMs / 1000);
  const diffDays = Math.floor(diffSec / 86400);

  const rtf = new Intl.RelativeTimeFormat(lang, { numeric: 'auto' });

  // 30日以上前なら絶対日付を返す
  if (diffDays >= thresholdDays) {
    const dateFormatter = new Intl.DateTimeFormat(lang === 'ja' ? 'ja-JP' : 'en-US', {
      year: 'numeric',
      month: '2-digit',
      day: '2-digit',
      hour: '2-digit',
      minute: '2-digit'
    });
    return dateFormatter.format(date);
  }

  // 相対表現
  if (diffSec < 60) {
    return rtf.format(-diffSec, 'second');
  } else if (diffSec < 3600) {
    return rtf.format(-Math.floor(diffSec / 60), 'minute');
  } else if (diffSec < 86400) {
    return rtf.format(-Math.floor(diffSec / 3600), 'hour');
  } else if (diffSec < 172800) {
    return lang === 'ja' ? '昨日' : 'yesterday';
  } else {
    return rtf.format(-diffDays, 'day');
  }
}

// 実行例
console.log(timeAgoOrDate(new Date(Date.now() - 5 * 60 * 1000), 'ja')); 
// "5分前"

console.log(timeAgoOrDate(new Date(Date.now() - 40 * 24 * 60 * 60 * 1000), 'ja')); 
// "2025/09/16 18:55" など

console.log(timeAgoOrDate(new Date(Date.now() - 40 * 24 * 60 * 60 * 1000), 'en')); 
// "09/16/2025, 06:55 PM"
JavaScript

ポイント

  • thresholdDays を変えれば「7日以上前は日付表示」など柔軟に設定可能
  • Intl.DateTimeFormat を使うので言語ごとに日付フォーマットが自動調整される
  • SNSやニュースサイトで「古い投稿は相対表現より日付の方が分かりやすい」ケースに便利

💡 さらに発展させると、「1年を超えたら年も表示、それ以内なら月日だけ」といった細かいルールも作れます。

タイトルとURLをコピーしました