似乎在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范围的粒度?
答案 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)
也是假的。