Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How can i check whether the current time in between tonight 9pm and 9am(tomorrow) in Ruby on Rails

I need to check whether my current times is between the specified time interval (tonight 9pm and 9am tomorrow). How can this be done in Ruby on Rails.

Thanks in advance

like image 436
Amal Kumar S Avatar asked Sep 28 '11 09:09

Amal Kumar S


3 Answers

Obviously this is an old question, already marked with a correct answer, however, I wanted to post an answer that might help people finding the same question via search.

The problem with the answer marked correct is that your current time may be past midnight, and at that point in time, the proposed solution will fail.

Here's an alternative which takes this situation into account.

now = Time.now

if (0..8).cover? now.hour 
# Note: you could test for 9:00:00.000 
#       but we're testing for BEFORE 9am.
#       ie. 8:59:59.999
  a = now - 1.day
else 
  a = now
end

start = Time.new a.year, a.month, a.day, 21, 0, 0
b = a + 1.day
stop = Time.new b.year, b.month, b.day, 9, 0, 0

puts (start..stop).cover? now

Again, use include? instead of cover? for ruby 1.8.x

Of course you should upgrade to Ruby 2.0

like image 157
ocodo Avatar answered Nov 04 '22 01:11

ocodo


Create a Range object having the two Time instances that define the range you want, then use the #cover? method (if you are on ruby 1.9.x):

now = Time.now
start = Time.gm(2011,1,1)
stop = Time.gm(2011,12,31)

p Range.new(start,stop).cover? now # => true

Note that here I used the explicit method constructor just to make clear that we are using a Range instance. You could safely use the Kernel constructor (start..stop) instead.

If you are still on Ruby 1.8, use the method Range#include? instead of Range#cover?:

p (start..stop).include? now
like image 3
p4010 Avatar answered Nov 04 '22 01:11

p4010


require 'date'

today = Date.today
tomorrow = today + 1

nine_pm = Time.local(today.year, today.month, today.day, 21, 0, 0)
nine_am = Time.local(tomorrow.year, tomorrow.month, tomorrow.day, 9, 0, 0)

(nine_pm..nine_am).include? Time.now #=> false 
like image 2
Michael Kohl Avatar answered Nov 04 '22 01:11

Michael Kohl