Ruby中的时间范围?

我想知道时间是属于某个时间表还是其他时间。

在我的情况下是计算时间是在夜间时间表正常时间表

我已经达成了这个解决方案:

NIGHT = ["21:00", "06:00"] def night?( date ) date_str = date.strftime( "%H:%M" ) date_str > NIGHT[0] || date_str < NIGHT[1] end 

但我认为不是很优雅,也只适用于这个具体案例而不是每个时间范围

(我发现几个类似的问题是SO,但它们都引用了日期范围没有时间范围)

更新

解决方案必须适用于随机时间范围,不仅适用于具体的时间范围。 让我们说:

 "05:00"-"10:00" "23:00"-"01:00" "01:00"-"01:10" 

这实际上或多或少是我会这样做的,除了可能更简洁:

 def night?( date ) !("06:00"..."21:00").include?(date.strftime("%H:%M")) end 

或者,如果您的日程安排边界可以保持在小时:

 def night?(date) !((6...21).include? date.hour) end 

注意... – 这基本上意味着“白天时间是小时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 

您几乎可以像普通范围一样使用它:

 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 

注意,上面的课程对时区一无所知。

在Rails 3.2中,它添加了Time.all_day和similars作为生成日期范围的方法。 我想你必须看看它是如何运作的。 它可能很有用。