では「一定期間を過ぎたら相対表現ではなく日付だけを表示する」方法を作ってみましょう。
たとえば 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年を超えたら年も表示、それ以内なら月日だけ」といった細かいルールも作れます。


