Ruby中的时间范围?

时间:2012-04-06 15:11:24

标签: ruby time

我想知道某个时间是否属于计划或其他。

在我的情况下,用于计算时间是否在夜班时间正常时间表

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

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"

2 个答案:

答案 0 :(得分:11)

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

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

请注意,上述课程对时区一无所知。

答案 1 :(得分:1)

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