3

似乎在红宝石 DateTime 范围内只有 1 天的粒度。

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 范围的粒度?

4

1 回答 1

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)

默认情况下,整数范围有step1个整数

所以(1...5).to_a会产生[1,2,3,4]

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

于 2013-06-02T03:02:24.317 回答