How can i check whether the current time in betwee

2020-07-07 06:14发布

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

6条回答
我命由我不由天
2楼-- · 2020-07-07 06:17
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 
查看更多
做自己的国王
3楼-- · 2020-07-07 06:21

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
查看更多
干净又极端
4楼-- · 2020-07-07 06:29

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

查看更多
孤傲高冷的网名
5楼-- · 2020-07-07 06:29

Here is how I check if an event is tomorrow in Rails 3.x

(event > Time.now.tomorrow.beginning_of_day) && (event < Time.now.tomorrow.end_of_day)
查看更多
可以哭但决不认输i
6楼-- · 2020-07-07 06:34

if time is between one day:

(start_hour..end_hour).include? Time.zone.now.hour

查看更多
来,给爷笑一个
7楼-- · 2020-07-07 06:37

This might read better in several situations and the logic is simpler if you have 18.75 for "18:45"

def afterhours?(time = Time.now)
  midnight = time.beginning_of_day
  starts = midnight + start_hours.hours + start_minutes.minutes
  ends = midnight + end_hours.hours + end_minutes.minutes
  ends += 24.hours if ends < starts
  (starts...ends).cover?(time)
end

I'm using 3 dots because I don't consider 9:00:00.000am after hours.

Then it's a different topic, but it's worth highlighting that cover? comes from Comparable (like time < now), while include? comes from Enumerable (like array inclusion), so I prefer to use cover? when possible.

查看更多
登录 后发表回答