10

我正在尝试对日期执行减法运算。

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

4 回答 4

8

这是预期的行为。从文档

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
于 2013-09-04T06:38:46.713 回答
2

因为您可能想找到两个DateTimes 之间的差异,这可能是Rational. 例如:

DateTime.new(2001,2,3) - DateTime.new(2001,2,2,12)
# ⇒ (1/2)
于 2013-09-04T06:04:53.287 回答
2

这对我来说也很困惑。

天的差总是一个整数,那为什么用有理数表示呢?

那是因为它是用于表示日期和日期时间或两个日期时间之间差异的相同返回类型。这样你就可以表示两个时间之间的差异。

我个人不相信这是最好的选择,例如:

Time.now.to_datetime-Date.today

返回:

=> (44150896597/86400000000)

它认为这更清楚:

=> 0.5110978639814815
于 2014-08-22T12:18:44.433 回答
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)
于 2013-09-04T06:05:51.023 回答