为什么日期之间的减法返回Rational类型?

时间:2013-09-04 05:57:05

标签: ruby

我正在尝试在日期执行减法操作。

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类型?

4 个答案:

答案 0 :(得分:6)

这是预期的行为。来自docs

  

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

答案 1 :(得分:2)

Because您可能希望找到两个DateTime之间的差异,这可能是Rational。 E.g:

DateTime.new(2001,2,3) - DateTime.new(2001,2,2,12)
# ⇒ (1/2)

答案 2 :(得分:2)

这对我来说也很困惑。

天之间的差异总是一个整数,所以为什么要把它表达为理性?

那是因为它是用于表示Date和DateTime之间的差异的相同返回类型,或两个DateTime。这样你可以表达两次之间的差异。

我个人并不认为这是最好的选择,例如:

Time.now.to_datetime-Date.today

返回:

=> (44150896597/86400000000)

它认为这更清楚:

=> 0.5110978639814815

答案 3 :(得分:0)

因为有时会发生如下的比较:

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)