Ruby DateTime范围只有1天的粒度

时间:2013-06-02 01:11:38

标签: ruby

似乎在ruby DateTime范围内只有一天的粒度。

now = DateTime.new(2013,1,1)
#=> #<DateTime: 2013-01-01T00:00:00+00:00 ((2456294j,0s,0n),+0s,2299161j)>

two_days_later = DateTime.new(2013,1,3)
#=> #<DateTime: 2013-01-03T00:00:00+00:00 ((2456296j,0s,0n),+0s,2299161j)>

range = (now..two_days_later)
#=> #<DateTime: 2013-01-01T00:00:00+00:00 ((2456294j,0s,0n),+0s,2299161j)>..#<DateTime: 2013-01-03T00:00:00+00:00 ((2456296j,0s,0n),+0s,2299161j)>

tomorrow = DateTime.new(2013,1,2)
#=> #<DateTime: 2013-01-02T00:00:00+00:00 ((2456295j,0s,0n),+0s,2299161j)>

range.include?(tomorrow)
#=> true

later_this_morning = now + 0.1
#=> #<DateTime: 2013-01-01T02:24:00+00:00 ((2456294j,8640s,0n),+0s,2299161j)>

range.include? later_this_morning
#=> false

# but .....

range.max
#<DateTime: 2013-01-03T00:00:00+00:00 ((2456296j,0s,0n),+0s,2299161j)>

期望的行为是它只会排除日期范围的最后一秒,以便最大值为2013-01-02T23:59:59,并且今天或明天的任何DateTime都将包含在该范围内。

有没有办法更改DateTime范围的粒度?

1 个答案:

答案 0 :(得分:8)

事实证明,我只需要使用Range#cover?而不是Range#include?

进一步说明

我相信Range#include?会首先将范围转换为数组,然后使用Array#include?查看该值是否为成员。

将范围(now...two_days_later)转换为数组时,它相当于包含现在从现在起1天

的数组
[2013-01-01T00:00, 2013-01-02T00:00:00]

一个类似的例子是一系列整数。 (1...5)

默认情况下,整数范围的step 1整数

因此(1...5).to_a会产生[1,2,3,4]

因此(1...5).include?(3.14)也是假的。