我如何在Ruby on Rails中检查今晚9点到9点(明天)之间的当前时间

时间:2011-09-28 09:01:13

标签: ruby-on-rails ruby ruby-on-rails-3 datetime

我需要检查当前时间是否在指定的时间间隔(明天晚上9点到明天上午9点)之间。如何在Ruby on Rails中完成。

提前致谢

6 个答案:

答案 0 :(得分:13)

显然这是一个老问题,已经标有正确的答案,但是,我想发布一个答案,可以帮助人们通过搜索找到相同的问题。

答案标记正确的问题是您当前的时间可能已经过了午夜,并且在那个时间点,建议的解决方案将会失败。

这是考虑到这种情况的替代方案。

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

同样,对于ruby 1.8.x

,请使用include?代替cover?

当然你应该升级到Ruby 2.0

答案 1 :(得分:3)

创建一个Range对象,该对象具有两个定义所需范围的Time实例,然后使用#cover?方法(如果您使用的是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

请注意,我在这里使用了显式方法构造函数,以明确我们正在使用Range实例。您可以安全地使用内核构造函数(start..stop)

如果您仍在使用Ruby 1.8,请使用方法Range#include?而不是Range#cover?

p (start..stop).include? now

答案 2 :(得分:2)

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 :(得分:1)

如果时间在一天之间:

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

答案 4 :(得分:0)

如果你有18.75代表“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

我使用3个点,因为我不考虑下班后的9:00:00.000。

然后这是一个不同的主题,但值得强调的是cover?来自Comparable(如time < now),而include?来自Enumerable(如{}数组包含),所以我倾向于尽可能使用cover?

答案 5 :(得分:0)

以下是我如何检查Rails 3.x中是否有明天的活动

(event > Time.now.tomorrow.beginning_of_day) && (event < Time.now.tomorrow.end_of_day)