如何在Rails中检查日期时间是否在范围内?

4

使用 Ruby 的 Range#include? 方法处理日期时间范围时会出现异常:

> (Time.zone.now.beginning_of_day..Time.zone.now.end_of_day).include?(Time.zone.now)
TypeError: can't iterate from ActiveSupport::TimeWithZone

使用Rails的Range#overlaps?是有效的:

> (Time.zone.now.beginning_of_day..Time.zone.now.end_of_day).overlaps?(Time.zone.now..Time.zone.now)
=> true

我不喜欢使用单元素范围来检查是否包含,需要使用overlaps?。在Rails中,是否有一种方法可以使用include?来处理日期时间范围?


你需要这个区域吗? - Brian
@brianslattery 不一定,这是为了尽可能清楚地说明我遇到的问题。我正在操作的对象属于ActiveSupport::TimeWithZone类型,因此需要使用.zone。您会注意到,如果没有时区,上述代码仍会抛出以下异常:TypeError: can't iterate from Time - sirdharma
1个回答

3

啊哈!

这个怎么样?

Time.zone.now.between?(Time.zone.now.beginning_of_day,Time.zone.now.end_of_day)

结果:

2.3.0 :001 > Time.zone.now.between?(Time.zone.now.beginning_of_day,Time.zone.tomorrow.end_of_day)
 => true 
2.3.0 :002 > Time.zone.tomorrow.between?(Time.zone.now.beginning_of_day,Time.zone.now.end_of_day)
 => false 
2.3.0 :003 > Time.zone.yesterday.between?(Time.zone.now.beginning_of_day,Time.zone.now.end_of_day)

参考资料:http://apidock.com/rails/ActiveSupport/TimeWithZone/between%3F


该链接是有关Rails中ActiveSupport/TimeWithZone类的between?方法的文档。该方法可用于比较两个时间戳是否在同一时区,返回布尔值。

1
这个方法可以解决我的问题,但并没有完全回答我的问题:为什么 Range::include? 不能用于日期时间?根据您的想法,我需要操作范围,所以我必须这样做 Time.zone.now.between?((Time.zone.now.beginning_of_day..Time.zone.now.end_of_day).begin, (Time.zone.now.beginning_of_day..Time.zone.now.end_of_day).end)。虽然它能够工作,但有点违背使用范围的初衷。 - sirdharma

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接