我想知道时间是属于某个时间表还是其他时间.
在我的情况下是计算时间是在夜间时间表或正常时间表.
我已经达成了这个解决方案:
NIGHT = ["21:00", "06:00"]
def night?( date )
date_str = date.strftime( "%H:%M" )
date_str > NIGHT[0] || date_str < NIGHT[1]
end
Run Code Online (Sandbox Code Playgroud)
但我认为不是很优雅,也只适用于这个具体案例而不是每个时间范围.
(我发现几个类似的问题是SO,但他们都参考了日期范围没有时间范围)
解决方案必须适用于随机时间范围,不仅适用于具体的时间范围.让我们说:
"05:00"-"10:00"
"23:00"-"01:00"
"01:00"-"01:10"
Run Code Online (Sandbox Code Playgroud)
Mic*_*ade 11
这实际上或多或少是我会这样做的,除了可能更简洁:
def night?( date )
!("06:00"..."21:00").include?(date.strftime("%H:%M"))
end
Run Code Online (Sandbox Code Playgroud)
或者,如果您的日程安排边界可以保持在小时:
def night?(date)
!((6...21).include? date.hour)
end
Run Code Online (Sandbox Code Playgroud)
注意...
- 这基本上意味着"白天时间是小时6到小时21但不包括小时21".
编辑:这是一个通用的(可悲的是不那么精辟)解决方案:
class TimeRange
private
def coerce(time)
time.is_a? String and return time
return time.strftime("%H:%M")
end
public
def initialize(start,finish)
@start = coerce(start)
@finish = coerce(finish)
end
def include?(time)
time = coerce(time)
@start < @finish and return (@start..@finish).include?(time)
return !(@finish..@start).include?(time)
end
end
Run Code Online (Sandbox Code Playgroud)
您几乎可以像普通范围一样使用它:
irb(main):013:0> TimeRange.new("02:00","01:00").include?(Time.mktime(2010,04,01,02,30))
=> true
irb(main):014:0> TimeRange.new("02:00","01:00").include?(Time.mktime(2010,04,01,01,30))
=> false
irb(main):015:0> TimeRange.new("01:00","02:00").include?(Time.mktime(2010,04,01,01,30))
=> true
irb(main):016:0> TimeRange.new("01:00","02:00").include?(Time.mktime(2010,04,01,02,30))
=> false
Run Code Online (Sandbox Code Playgroud)
注意,上面的课程对时区一无所知.