如何知道今天的date是否在date范围内?

我有一个事件start_timeend_time并希望检查事件是否“正在进行”。 那将是检查今天的date是否在两个date之间的范围内。

你将如何做这个function?

使用===


实际上,有一个运营商会这样做。 创build一个Range并使用===运算符比较Time对象。

 start = Time.now.to_i range = start..(start + 2) inside = start + 1 outside = start + 3 # ok, now... range === inside # true range === outside # false 

更新post-comment-flood:这个版本在任何地方都能正常工作。 (在Rails中,在Ruby 1中,在Ruby 2中)。早期的irb例子也工作得很好,但是在一些实验中交互式的例子并不总是被正确地重现。 这一个更容易剪切和粘贴。

现在全部理顺了。

在Ruby 1.9.2中===不起作用,我得到一个错误:

 irb(main):019:0> (Time.now .. (Time.now+1)) === Time.now TypeError: can't iterate from Time from (irb):19:in `each' from (irb):19:in `include?' from (irb):19:in `include?' from (irb):19:in `===' from (irb):19 from /opt/ruby192/bin/irb:12:in `<main>' 

而是使用#cover?

 irb(main):002:0> (Time.now..Time.now+4).cover?(Time.now) => true irb(main):003:0> (Time.now..Time.now+4).cover?(Time.now+10) => false 

如果你使用Rails,你可以使用TimeWithZone#between? 。 你会有这样的事情:

 > start_time = Time.zone.parse('12pm') => Thu, 26 Jul 2012 12:00:00 EDT -04:00 > end_time = start_time + 1.hour => Thu, 26 Jul 2012 13:00:00 EDT -04:00 > inside = Time.zone.parse('12:30pm') => Thu, 26 Jul 2012 12:30:00 EDT -04:00 > outside = Time.zone.parse('1:30pm') => Thu, 26 Jul 2012 13:30:00 EDT -04:00 > inside.between?(start_time, end_time) => true > outside.between?(start_time, end_time) => false 

因为date类包含了Comparable模块,所以每个date对象都有一个between? 方法。

 require 'date' today = Date.today tomorrow = today + 1 one_month_later = today >> 1 tomorrow.between?(today, one_month_later) # => true 

如果你使用的是Rails,你可以试试这个:

 ruby-1.8.7-p299 :015 > a = DateTime.now => Fri, 02 Dec 2011 11:04:24 -0800 ruby-1.8.7-p299 :016 > (a.beginning_of_day..a.end_of_day).include_with_range? a => true ruby-1.8.7-p299 :017 > (a.beginning_of_day..a.end_of_day).include_with_range? a+10.days => false ruby-1.8.7-p299 :018 > (a.beginning_of_day..a.end_of_day).include_with_range? a+25.hours => false ruby-1.8.7-p299 :019 > (a.beginning_of_day..a.end_of_day).include_with_range? a+2.hours => true 

注意:我只是使用beginning_of_dayend_of_day来提供一个简单的范围。 重要的部分是include_with_range? 方法的范围。

如果他们是时间戳:

  def in_progress?
   (start_time..end_time).INCLUDE?(Time.now)
结束