直径1.5メートル

ひよっこエンジニアのちょっとしたメモ。主に備忘録。

【Rails】prev_weekをprev_monthと同じノリで使うと「あれっ」となる

何かと日付計算は使うと思いますが、「一週間前」をどう出すかについて。
「一週間前」の計算をprev_monthと同じノリでprev_weekを利用して計算した際、意図したものにならず「あれっ?」となることがありました。ので、メモ。

例えば↓のような計算。

> Date.yesterday
#=> Sun, 30 Apr 2017

> Date.yesterday.prev_month
#=> Thu, 30 Mar 2017

> Date.yesterday.prev_week
#=> Mon, 17 Apr 2017

何も気にせずにやっていると、あれ?Date.yesterday.prev_weekは2017年4月23日じゃないの?となります。
が、よくよくソースを見ると処理が全く違うオチ。

prev_week

def prev_week(start_day = Date.beginning_of_week, same_time: false)
  result = first_hour(weeks_ago(1).beginning_of_week.days_since(days_span(start_day)))
  same_time ? copy_time_to(result) : result
end

rails/calculations.rb at f2c6db41ba56afb1529e4732c59622fc0cf9f3ba · rails/rails · GitHub

prev_month

def prev_month
  months_ago(1)
end

rails/calculations.rb at f2c6db41ba56afb1529e4732c59622fc0cf9f3ba · rails/rails · GitHub

prev_weekの中身はまだ詳しく知りたいのでおいおい。

おとなしく「一週間前」を出そうとすると、こういうことになるのでしょうか。

> Date.yesterday.weeks_ago(1)
#=> Sun, 23 Apr 2017

> Date.yesterday - 1.week
#=> Sun, 23 Apr 2017