【问题标题】:Time-of-day range in Ruby?Ruby 中的时间范围?
【发布时间】:2012-04-20 04:25:27
【问题描述】:

我想知道一个时间是属于一个时间表还是另一个。

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

我已经找到了这个解决方案:

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

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

(我发现几个类似的问题是 SO,但它们都引用了 Date 范围而不是 Time 范围)

更新

解决方案必须适用于随机时间范围,而不仅仅适用于这个具体的时间范围。比方说:

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

【问题讨论】:

    标签: ruby time


    【解决方案1】:

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

    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
    

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

    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
    

    注意,上面的类不知道时区。

    【讨论】:

    • 我喜欢第二个版本。我认为这是最好的解决方案,因为我们不关心几分钟,只关心几小时。
    • 我正在寻找一种通用范围解决方案,而不仅仅是一种特殊情况。 仅适用于第一个版本仅适用于不跨越 24:00 的范围。同样,我的解决方案仅适用于跨 24:00 的范围。 23:00...01:00 不使用相反的范围呢? 第二个版本不正确 06:10 不是晚上。
    • 好的,请修改您的问题。
    • @Michael 我已经用示例更新了它。也许我的具体例子引起了混乱,我试图解释我对句子 “仅适用于这个具体案例而不适用于每个时间范围”的担忧
    • 注意时区问题。我还认为在夏令时转换期间可能会发生有趣的事情。
    【解决方案2】:

    在 Rails 3.2 中,它添加了 Time.all_day 和类似的东西作为生成日期范围的一种方式。我想你必须看看它是如何工作的。可能有用。

    【讨论】:

    • 能否请您改写一下,以便回答问题?
    猜你喜欢
    • 1970-01-01
    • 2014-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-19
    相关资源
    最近更新 更多