日付に対して減算操作を実行しようとしています。
date_sent = Date.parse("2013-01-01") #=> Tue, 01 Jan 2013
date_now = Date.today #=> Wed, 04 Sep 2013
days = (date_now - date_sent) #=> (246/1)
型date_now - date_sent
を返すのはなぜですか?Rational
日付に対して減算操作を実行しようとしています。
date_sent = Date.parse("2013-01-01") #=> Tue, 01 Jan 2013
date_now = Date.today #=> Wed, 04 Sep 2013
days = (date_now - date_sent) #=> (246/1)
型date_now - date_sent
を返すのはなぜですか?Rational
これは予想される動作です。ドキュメントから:
d - その他 → 日付または有理数
Date.new(2001,2,3) - 1 #=> #<Date: 2001-02-02 ...> Date.new(2001,2,3) - Date.new(2001) #=> (33/1)
違いを正確に表現できるため、有理型が使用されます。
diff = DateTime.new(2001,2,3) - DateTime.new(2001,2,2,1)
#=> (23/24)
フロートはできませんが:
diff.to_f
#=> 0.9583333333333334
DateTime
である 2 つの の差を見つけたい場合があるためRational
です。例えば:
DateTime.new(2001,2,3) - DateTime.new(2001,2,2,12)
# ⇒ (1/2)
これは私も混乱しました。
日数の差は常に整数であるのに、なぜそれを有理数で表現するのでしょうか?
これは、Date と DateTime、または 2 つの DateTime の差を表現するために使用される戻り値の型が同じであるためです。そのようにして、2 つの時間の差を表現できます。
個人的には、それが最良の選択であるとは確信していません。たとえば、次のようになります。
Time.now.to_datetime-Date.today
戻り値:
=> (44150896597/86400000000)
これはより明確だったと思います:
=> 0.5110978639814815
以下のような比較が時々起こるからです:
date_sent = DateTime.parse("2013-01-01 12:00:00") # with half a day
date_now = Date.today
days = (date_now - date_sent) # => (491/2)