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}] 
4

2 に答える 2

8

Range#stepを使用しますが、予防策として、最初に日付を整数に変換します(明らかに、整数を使用する範囲ではstep()が最適化されています—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},
...
于 2012-07-27T03:02:49.277 に答える
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
于 2012-07-27T03:09:55.520 に答える