我有一个定义时间范围的模型:
STARTTIME: HH:MM
ENDTIME: HH:MM
现在我需要使用格式为HH:MM的给定时间ACTUALTIME
进行查询,并检查ACTUALTIME
是否在我定义的任何给定时间范围内:STARTTIME
和ENDTIME
。
由于Ruby时间对象仅由小时和分钟定义时始终用日期表示,我不知道是否有可能查询类似的内容: 在没有考虑日期部分的情况下,在11:00到15:00之间是13:40。
答案 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