红宝石的时间比较

时间:2011-11-18 10:31:12

标签: ruby time comparison

我想检查当前时间是否在上午10点到晚上10点之间。我该怎么办?

4 个答案:

答案 0 :(得分:5)

您可以定义Range并检查包含。

(10..22).include?(Time.new.hour)
# => true

您的代码将是

if (10..22).include?(Time.new.hour)
  # do whatever you want
end

答案 1 :(得分:4)

尝试类似:

time = Time.new
if time.hour >= 10 && time.hour < 22
    // Your code
end

更多信息:http://www.tutorialspoint.com/ruby/ruby_date_time.htm

我从来没有使用过Ruby语言,但是如果你只是google它,那么你的第一个结果中的一个将是如何获得当前时间。

答案 2 :(得分:1)

为什么不使用between?

d1 = Time.new(2011,11,18,10)
d2 = Time.new(2011,11,18,22)

[
  Time.new(2011,11,18,9),
  Time.new(2011,11,18,12),
  Time.new(2011,11,18,23),
].each{|d|
  p d.between?(d1,d2)
}

结果

false
true
false    

作为替代方案,您必须根据您的测试时间创建自己的时间:

[
  Time.new(2011,11,18,9),
  Time.new(2011,11,18,12),
  Time.new(2011,11,18,23),
].each{|d|
  d1 = Time.new(d.year,d.month,d.day,10)
  d2 = Time.new(d.year,d.month,d.day,22)
  p d.between?(d1,d2)
}

基于此,您可以扩展Time

class Time
  def between_hours?( h1, h2)
    d1 = Time.new(year,month,day,h1)
    d2 = Time.new(year,month,day,h2)
    self.between?(d1,d2)
  end
end

[
  Time.new(2011,11,18,9),
  Time.new(2011,11,18,12),
  Time.new(2011,11,18,23),
].each{|d|
  p d.between_hours?(10,22)
}

答案 3 :(得分:0)

只需添加以供将来参考:(JRuby 1.6.7,ruby 1.9.2-p132)

require 'time'
require 'benchmark'

s= Time.parse("2012-04-12 11:00")
m= Time.parse("2012-04-12 11:30")
e= Time.parse("2012-04-12 12:00")

Benchmark.bm do |bm|
    bm.report { 10_000.times{ (s..e).include?(m) } } # slow!
    bm.report { 1_000_000.times{ (s..e).cover?(m) } }
    bm.report { 1_000_000.times{ m.between?(s, e) } }
end

收益率(amd64 x4 core archlinux)

  user     system      total        real
2.390000   0.000000   2.390000 (  2.389000)
0.342000   0.000000   0.342000 (  0.342000)
0.153000   0.000000   0.153000 (  0.154000)