2011-11-18 161 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)