检查事件是否在时间范围内

时间:2012-04-05 16:02:00

标签: ruby-on-rails ruby time

我有一个定义时间范围的模型:

STARTTIME: HH:MM
ENDTIME: HH:MM

现在我需要使用格式为HH:MM的给定时间ACTUALTIME进行查询,并检查ACTUALTIME是否在我定义的任何给定时间范围内:STARTTIMEENDTIME

由于Ruby时间对象仅由小时和分钟定义时始终用日期表示,我不知道是否有可能查询类似的内容: 在没有考虑日期部分的情况下,在11:00到15:00之间是13:40。

2 个答案:

答案 0 :(得分:1)

如果您的HH:MM是字符串,并且它们始终为零填充(例如“03:08”),那么您可以使用简单的字符串比较:

irb:02> first = "03:17"; last = "11:54"
#=> "11:54"
irb:03> range = first..last
#=> "03:17".."11:54"
irb:04> range.include? "00:00"
#=> false
irb:05> range.include? "03:50"
#=> true
irb:06> range.include? "03:09"
#=> false
irb:07> range.include? "12:17"
#=> false
irb:08> range.include? "11:17"
#=> true

如果您的STARTTIME和ENDTIME作为Time的实例进入Ruby,那么您可以编写一个方法将它们转换为字符串(my_time.strftime('%H:%M')),或者只需编写一个比较器:

# Returns true if hour:min is between the times in t1 and t2
def between(hour,min,t1,t2)
  t1.hour<=hour && hour<=t2.hour && t1.min<=min && min<=t2.min
end

答案 1 :(得分:0)

感谢Phrogz的建议我想出了如何编写一个可以独立于其日期进行两次比较的方法。即使ENDTIME在24:00之后

,它也能正常工作
def betweenTime(timestart, timeend, timecheck)

 getseconds = lambda{ |time| time.hour*60*60 + time.min*60 + time.sec}

 timestart = getseconds[timestart]
 timeend = getseconds[timeend]
 timecheck = getseconds[timecheck]


 if (timeend-timestart) < 0
   timeend = timeend + (60*60*24) # add seconds for one day if timeend is after 24:00
 end

 timecheck.between?(timestart, timeend)
end