2011-11-18 160 views
2

我想检查当前时间是否在10AM和10PM之间。我该如何做检查?红宝石时间比较

+0

它被认为是好形式包括你写的代码,解释你遇到的问题。如果不这样做,听起来好像你在没有完成工作的情况下正在寻找答案。 –

回答

5

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

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

您的代码将是

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

你不觉得使用'<' and '>'是一个更好的解决方案,因为include会在内部使用搜索,而我们只需要检查它是否在边界内。即如果你有一个有序数组并且你想知道是否存在一个条目,那么你只需检查外部边界而不是搜索整个数组。 – Swanand

+1

1.9.3有Range#cover?避免@ Swanand的反对。 – steenslag

1

为什么不使用between??在

false 
true 
false  

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) 
} 

结果作为替代,你必须创建从到时根据您的原料与材料:

[ 
    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) 
} 
0

刚刚添加该以供将来参考:(1.6.7的JRuby,红宝石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核心的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)