为什么介于?之间ruby中Date和DateTime的工作方式不同?

时间:2017-03-22 08:34:21

标签: ruby-on-rails ruby date datetime

doc说:

  

介于?(min,max)public

之间      

如果当前对象的时间在指定的min内,则返回true   和最长时间。

在Ruby中:

>> DateTime.now.between?(DateTime.now, DateTime.now+1)
=> false
>> Date.today.between?(Date.today, Date.today+1)
=> true

通过在Rails中使用.current,差异变得更加清晰,因为您特别假设此方法在DateTimeDate上具有相似的行为:

>> DateTime.current.between?(DateTime.current, DateTime.current+1)
=> false
>> Date.current.between?(Date.current, Date.current+1)
=> true

这是故意的行为吗?如果是这样,为什么?处理区间的min边缘时的行为并不是特殊的,这似乎很奇怪。特别是在考虑max部分是特殊的时候:

>> DateTime.now.between?(DateTime.now-1, DateTime.now)
=> true
>> Date.today.between?(Date.today-1, Date.today)
=> true

4 个答案:

答案 0 :(得分:5)

让我们启动irb并运行这些代码:

"#{DateTime.now.inspect} \n #{DateTime.now.inspect}"

结果'将是这样的:

#<DateTime: 2017-03-22T11:42:28+03:00 ((2457835j,31348s,373353553n),+10800s,2299161j)>
#<DateTime: 2017-03-22T11:42:28+03:00 ((2457835j,31348s,373449152n),+10800s,2299161j)>

如您所见,存在差异,以纳秒为单位(373353553n <373449152n)

让我们假设差异等于&#39; x&#39;,而DateTime.now等于&#39;现在&#39;,然后:

  

1)DateTime.now.between?(DateTime.now,DateTime.now + 1.second)

     

Now.between?(Now + x,Now + x + x + 1.second)=&gt;假

     

2)DateTime.now.between?(DateTime.now-1,DateTime.now)

     

Now.between?(现在+ x-1.second,Now + x + x)=&gt;真

答案 1 :(得分:2)

那是因为时间流逝。 您检查的第一个DateTime.now,在第二个DateTime.now之前的几毫秒,在括号中。

答案 2 :(得分:2)

正如其他人所说:

a.between?(b,c)

abc之前几毫秒被解释。

获得理想结果的最短途径是:

(now=DateTime.now).between?(now, now+1)
#=> true

您还可以颠倒DateTime对象初始化的顺序:

(DateTime.now..DateTime.now+1).cover? DateTime.now
#=> true

答案 3 :(得分:1)

好像它的问题几毫秒

DateTime.now.between?(DateTime.now, DateTime.now+1)
^ executing first     ^ executing after few milliseconds or nanoseconds

DateTime与您所比较的内容的值是否比 DateTime value in之间的值高?`

但是如果你把它保存在变量

now = DateTime.now
now.between?(now,now+1)
#=> true

另外,正如@ndn评论

DateTime.now ==  DateTime.now
#=> false