LoginSignup
3
4

More than 1 year has passed since last update.

【日付計算】Rubyで◯時間前、◯日前、◯ヶ月前、◯年前と計算するメソッド

Last updated at Posted at 2022-07-30

業務で更新日(updated_at)と今日の差分を計算して○日前と返すapiを作成することがあったのですが、この仕様とマッチする記事がなかったのでQiitaに残しておきます!

以下の記事を参考にさせていただきました。
基本的なロジックやコードの解説はこちらの記事を参考にしてください。

満経過月数を計算するロジック(Ruby)

今回の仕様

最終更新日から今日の差分を計算して○日前と返す

『0~24時間前』 『1~30日前』 『1ヶ月~12ヶ月』 『1年~』の単位で区切る

例) Today:2022/07/30/10:00
Last_updated:2021/07/30/19:00
⇨『一年前』を返す

例)Today:2022/07/30/10:00
Last_updated:2022/06/30/19:00
⇨『一ヶ月前』を返す

例)Today:2022/07/30/19:00
Last_updated:2022/07/29/19:00
⇨『一日前』を返す

例)Today:2022/07/30/10:00
Last_updated:2022/07/29/19:00
⇨『15時間前』を返す

※注意点

『◯年前』と『◯ヶ月前』はTodayの時間がLast_updatedの時間を超えていなくても日付が更新される。
⇨日付が変わったタイミングで更新される。

Today:2022/07/30/00:00
Last_updated:2021/07/30/10:00
⇨『一年前』を返す

『◯日前』はTodayの時間がLast_updatedの時間を超えたら日付が更新される。
⇨時間を超えるまで更新されない。

Today:2022/07/30/10:00
Last_updated:2022/07/29/19:00
⇨『15時間前』を返す

例)Today:2022/07/30/19:00
Last_updated:2022/07/29/19:00
⇨『一日前』を返す

コード

ruby.rb
    NUMBER_OF_MONTHS = 12
    SECONDS_PER_HOUR = 3600
    HOURS_PER_DAY = 24

  def calculate_date(last_updated)
    today = Time.current

    diff_years = calculate_diff_years(today, last_updated)
    return "#{diff_years}年前" if diff_years >= 1

    diff_months = calculate_diff_months(today, last_updated)
    return "#{diff_months}ヶ月前" if diff_months >= 1

    diff_days = calculate_diff_days(today, last_updated)
    return "#{diff_days}日前" if diff_days >= 1

    diff_hours = calculate_diff_hours(today, last_updated)
    "#{diff_hours}時間前"
  end

  def calculate_diff_years(today, last_updated)
    calculate_diff_months(today, last_updated) / NUMBER_OF_MONTHS
  end

  def calculate_diff_months(today, last_updated)
    (today.year - last_updated.year) * NUMBER_OF_MONTHS + today.month - last_updated.month - (today.day >= last_updated.day ? 0 : 1)
  end

  def calculate_diff_days(today, last_updated)
    (today.to_i / SECONDS_PER_HOUR - last_updated.to_i / SECONDS_PER_HOUR) / HOURS_PER_DAY
  end

  def calculate_diff_hours(today, last_updated)
    (today.to_i / SECONDS_PER_HOUR - last_updated.to_i / SECONDS_PER_HOUR) % HOURS_PER_DAY
  end

最後に

よくある実装なので何かgemあると思ったのですが、無くて意外でした笑
同じような実装する時があれば参考にしてもらえると幸いです。

参考になったよって方はLGTMやTwitterをフォローしていただけると嬉しいです!

3
4
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
4