2012-07-27 53 views
4

如何從一個範圍內返回一組天數和小時數?到目前爲止,我曾嘗試:如何從範圍中返回一組天數和小時數?

(48.hours.ago..Time.now.utc).map { |time| { :hour => time.hour } }.uniq 

返回:

[{:hour=>1}, {:hour=>2}, {:hour=>3}, {:hour=>4}, {:hour=>5}, {:hour=>6}, {:hour=>7}, {:hour=>8}, {:hour=>9}, {:hour=>10}, {:hour=>11}, {:hour=>12}, {:hour=>13}, {:hour=>14}, {:hour=>15}, {:hour=>16}, {:hour=>17}, {:hour=>18}, {:hour=>19}, {:hour=>20}, {:hour=>21}, {:hour=>22}, {:hour=>23}, {:hour=>0}] 

並不理想,因爲它的迭代每一秒。這需要很長時間。而我得到幾個警告信息是說:

/Users/Chris/.rvm/gems/ruby-1.9.2-p290/gems/activesupport-3.2.2/lib/active_support/time_with_zone.rb:328: warning: Time#succ is obsolete; use time + 1 

我試圖返回類似:

[{:day => 25, :hour=>1}, {:day => 25, :hour=>2}, {:day => 25, :hour=>3}, {:day => 25, :hour=>4} ... {:day => 26, :hour=>1}, {:day => 26, :hour=>2}, {:day => 26, :hour=>3}, {:day => 26, :hour=>4}] 

回答

7

使用Range#step,但作爲預防措施,首先將日期轉換爲整數(顯然ranges using integers have step() optimized -YMMV )。作爲一個風格問題,我也首先截斷小時。

下面是一些簡單的 'N' 髒代碼:

#!/usr/bin/env ruby 

require 'active_support/all' 

s=48.hours.ago 
n=Time.now 

st=Time.local(s.year, s.month, s.day, s.hour).to_i 
en=Time.local(n.year, n.month, n.day, n.hour).to_i 

result = (st..en).step(1.hour).map do |i| 
    t = Time.at(i) 
    { day: t.day, hour: t.hour } 
end 

puts result.inspect 

產量:

[{:day=>25, :hour=>11}, {:day=>25, :hour=>12}, {:day=>25, :hour=>13}, 
{:day=>25, :hour=>14}, {:day=>25, :hour=>15}, {:day=>25, :hour=>16}, 
... 
2
stime = 48.hours.ago 
etime=Time.now.utc 
h = [] 
while stime <= etime 
    h.push({ :day => stime.day, :hour => stime.hour }) 
    stime += 1.hour 
end 
相關問題