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

Ruby on rails 检查事件是否在时间范围内,ruby-on-rails,ruby,time,Ruby On Rails,Ruby,Time,我有一个时间框架模型,定义如下: STARTTIME: HH:MM ENDTIME: HH:MM 现在,我需要以HH:MM格式对给定的时间ACTUALTIME进行查询,并检查ACTUALTIME是否在由以下定义的任何给定时间范围内:STARTTIME和ENDTIME 由于Ruby time对象在仅由小时和分钟定义时总是由日期表示,因此我想知道是否有可能查询以下内容: 在11:00和15:00之间的13:40,不考虑日期部分。如果您的HH:MM是字符串,并且它们始终是零填充的(例如“03:08”

我有一个时间框架模型,定义如下:

STARTTIME: HH:MM
ENDTIME: HH:MM
现在,我需要以HH:MM格式对给定的时间
ACTUALTIME
进行查询,并检查
ACTUALTIME
是否在由以下定义的任何给定时间范围内:
STARTTIME
ENDTIME

由于Ruby time对象在仅由小时和分钟定义时总是由日期表示,因此我想知道是否有可能查询以下内容:
在11:00和15:00之间的13:40,不考虑日期部分。

如果您的
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
#如果hour:min介于t1和t2之间,则返回true
def介于(小时、分钟、t1、t2)之间

感谢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
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]
如果(timeend timestart)<0
timeend=timeend+(60*60*24)#如果timeend在24:00之后,则添加秒数,持续一天
结束
timecheck.between?(timestart,timeend)
结束

谢谢Phrogz,只要ENDTIME不是24:00之后,这两种解决方案似乎都能完美工作,比如:STARTTIME 19:00;完时间03:00。但是有了你的hep代码,我想出了如何编写一个方法来完成这项工作。在此附上注意,在Ruby中定义一个方法与在JavaScript中定义一个方法不同:每次调用
betweenTime
时,在同一范围内(非私有)重新定义一个新的
getseconds
方法。您可能需要
getseconds=lambda{| time |…};timestart=getseconds[timestart]
。请注意,如果
timestart:21:30
timeend:04:30
timecheck:02:00
在24:00之后,您没有更改
timecheck
,则此选项不起作用,因此,在这种情况下,它的数值小于
timestart
,小于
timeend
,从而产生
false
返回值。。。