How to know if today's date is in a date range? How to know if today's date is in a date range? ruby ruby

How to know if today's date is in a date range?


In Ruby 1.9.2 === doesn't work, I get an error:

irb(main):019:0> (Time.now .. (Time.now+1)) === Time.nowTypeError: 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>'

Instead use #cover?:

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


Use ===


Actually, there is an operator that will do this. Make a Range and compare Time objects to it using the === operator.

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


Update post-comment-flood: This version works well everywhere. (In Rails, in Ruby 1, and in Ruby 2.) The earlier irb example also worked fine but the interactive example wasn't always reproduced correctly in some experiments. This one is easier to cut-and-paste.

It's all straightened out now.


If you're using Rails you can use TimeWithZone#between?. You'd then have something like this:

> 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