Rails:为什么以及如何在这个例子中为相等的日期添加明显相等的值会产生不同的结果?

ant*_*ome 2 ruby ruby-on-rails date

我看到打字100.days给了我[编辑:似乎给了我]一个Fixnum 8640000:

> 100.days.equal?(8640000)
 => true 
Run Code Online (Sandbox Code Playgroud)

我原以为这两个值是可以互换的,直到我试过这个:

x = Time.now.to_date
=> Wed, 31 Oct 2012 
> [x + 100.days, x + 8640000]
=> [Fri, 08 Feb 2013, Mon, 07 May 25668] 
Run Code Online (Sandbox Code Playgroud)

为什么以及如何在相等日期添加明显相等的值会产生不同的结果?

上面的结果来自Rails控制台,使用Rails 3.1.3版和Ruby版1.9.2p320.(我知道,我应该升级到最新版本......)

Fre*_*ung 6

100.days不返回Fixnum,它返回一个ActiveSupport::Duration,在大多数操作下很难看起来像一个整数.

Date#+并且Time#+被覆盖以检测是否正在添加持续时间,如果是这样,则计算正确而不是仅添加整数值(在时间.+期望数秒,即+ 86400提前1天,日期.+期望天数,所以+ 86400提前86400天).

此外,还包括一些特殊情况,例如在白天节省日期时增加一天.这也允许Time.now + 1.month提前1个日历月,而不管当月的天数.

  • +1好抓.`100.days.class`将在IRB中返回`Fixnum`,这是误导性的.`100.days.is_a?ActiveSupport :: Duration`返回`true`,证明了这一点. (2认同)