動かざることバグの如し

近づきたいよ 君の理想に

Railsのtime_ago_in_wordsをJavaScriptで実装する

環境

  • ES2024

やりたいこと

Railsにはtime_ago_in_wordsという非常に便利なメソッドがある

# 10分前の時刻を生成
ten_minutes_ago = Time.now - 10.minutes

# time_ago_in_wordsを使用して相対時間を表示
puts time_ago_in_words(ten_minutes_ago)

これをJavaScriptでも実現したい

コード

実はRails公式がJSコードを公開してくれている。

gist:58761

が16年前のコードでvarだったり == だったりと最新のJS仕様についていけてないのでChatGPTにリファクタリングしてもらった

直してもらったコード

export const timeAgoInWords = (from) => {
  return distanceOfTimeInWords(new Date(), from);
};

const distanceOfTimeInWords = (to, from) => {
  const distanceInSeconds = (to - from) / 1000;
  const distanceInMinutes = Math.floor(distanceInSeconds / 60);

  if (distanceInMinutes === 0) {
    return '1分未満前';
  }
  if (distanceInMinutes === 1) {
    return '1分前';
  }
  if (distanceInMinutes < 45) {
    return `${distanceInMinutes}分前`;
  }
  if (distanceInMinutes < 90) {
    return '約1時間前';
  }
  if (distanceInMinutes < 1440) {
    return `約${Math.floor(distanceInMinutes / 60)}時間前`;
  }
  if (distanceInMinutes < 2880) {
    return '1日前';
  }
  if (distanceInMinutes < 43200) {
    return `${Math.floor(distanceInMinutes / 1440)}日前`;
  }
  if (distanceInMinutes < 86400) {
    return '約1ヶ月前';
  }
  if (distanceInMinutes < 525960) {
    return `${Math.floor(distanceInMinutes / 43200)}ヶ月前`;
  }
  if (distanceInMinutes < 1051199) {
    return '約1年前';
  }

  return `${Math.floor(distanceInMinutes / 525960)}年以上前`;
};

サンプルコード

// 現在時刻から10分前のDateオブジェクトを生成
const tenMinutesAgo = new Date(Date.now() - 10 * 60 * 1000);

// timeAgoInWords関数を使用して相対時間を表示
console.log(timeAgoInWords(tenMinutesAgo));

ちなみに

書き終わってから知ったがDay.jsでも相対時刻の表示はできたっぽい。。。

Day.jsで相対日時を厳密に表示する(thresholds)