Ruby
Rails

Railsの1年は思いのほか厳密だった話

小ネタですが、不意に見つけたので。

1.year

1.year.to_i
=> 31556952

1の位が2っておかしくない??

1.year.to_f/60/60/24
=> 365.2425

この端数はもしや4年に一度固まって1日分になったりならなかったりするやつ…!!

西暦年が4で割り切れる年は閏年。
ただし、西暦年が100で割り切れる年は平年。
ただし、西暦年が400で割り切れる年は閏年。

400.years.to_f/60/60/24
=> 146097.0
365*100 + 97
=> 146097

おー。。

1.month

1.month.to_f
=> 2629746.0
1.month.to_f/60/60/24
=> 30.436875
1.month.to_f/60/60/24 * 12
=> 365.2425

おー。。

1.day

1.day.to_f
=> 86400.0
1.day.to_f/60/60/24
=> 1.0

なるほど。

ちなみに

1.year.class
=> ActiveSupport::Duration

今回はto_fで数値化してるから端数が出てるだけであって、
ActiveSupport::Durationのまま普通に日数計算するとよしなにしてくれるので心配無用です。

cur = Time.current
=> Mon, 21 May 2018 09:22:33 UTC +00:00
cur = Time.current + 1.year
=> Tue, 21 May 2019 09:22:33 UTC +00:00