How do I return an array of days and hours from a range? So far I have tried:
(48.hours.ago..Time.now.utc).map { |time| { :hour => time.hour } }.uniq
Returns:
[{: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}]
Not ideal, since its iterates over every second. Which takes a long time. And I get several warning messages that say:
/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
I am trying to return something like:
[{: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}]
Use Range#step, but as a precaution, convert the dates to integers first (apparently ranges using integers have step() optimized—YMMV). As a matter of style, I also truncate to the hour first.
Here's some quick 'n' dirty code:
#!/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
Yields:
[{:day=>25, :hour=>11}, {:day=>25, :hour=>12}, {:day=>25, :hour=>13},
{:day=>25, :hour=>14}, {:day=>25, :hour=>15}, {:day=>25, :hour=>16},
...
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With