ruby - Ruby 中的时间范围?

标签 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"

最佳答案

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

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

请注意,上面的类对时区一无所知。

关于ruby - Ruby 中的时间范围?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10045396/

相关文章:

ruby - 使用户输入的 url 成为 rails 中的外部链接

ruby - 设置属性类型而不在带有Tire的ElasticSearch中设置_type

mysql - LoadError 尝试在 Windows、RubyMine IDE 中将 MySQL 与 Ruby on Rails 结合使用

ruby - 无法使用种子本地主机 :27017 连接到副本集

Python Ctime 转换

c - sinf() 比 <math.h> 中的 sin() 快?

ruby - Bash - 如何从后台 ruby​​ 脚本获取 STDOUT

.net - 如何检测系统时间是否更改? (来自.net)

time - 查看大小写错误的数据时,Vue.js 会引发错误

javascript:如何使函数运行得更快