DateTime に月、日、時、分、秒を足す。

DateTimeに秒を足す方法がなかなか見つからなくて苦労した。結局ActiveSupportのソースから探した。

Rationalを足せば良い。

require 'date'
t = DateTime.now

# 1ヶ月後
t >> 1

# 1日後
t + 1

# 1時間後 (1/24日後)
t + Rational(1, 24) 

# 1分後 (1/1440日後)
t + Rational(1, 24 * 60) 

# 1秒後 (1/86400日後)
t + Rational(1, 24 * 60 * 60) 

秒を足すことばかり考えてたけど、「Ruby DateTime 時間」で検索したらあっさり見つかった。

でもマニュアルにも書いといてほしいです。いっぺんTimeに変換しなくちゃ駄目なのかと思いかけた。


ちなみに、Floatでもいけるかなーと思ったけど、

t = DateTime.new(2040, 1, 1)
p (t + 0.5).to_s
"2040-01-01T12:00:00+00:00"

これだと誤差がでるみたい。

p (t + 0.5 + Rational(1, 24)).to_s
"2040-01-01T12:59:59+00:00"
p (t + Rational(1,2) + Rational(1, 24)).to_s
"2040-01-01T13:00:00+00:00"

Floatの0.5は約0.5だからなんだろうけど、、間違えそうでおそろしい。