業務で更新日(updated_at)と今日の差分を計算して○日前と返すapiを作成することがあったのですが、この仕様とマッチする記事がなかったのでQiitaに残しておきます!
以下の記事を参考にさせていただきました。
基本的なロジックやコードの解説はこちらの記事を参考にしてください。
今回の仕様
最終更新日から今日の差分を計算して○日前と返す
『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
⇨『一日前』を返す
コード
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をフォローしていただけると嬉しいです!