ruby - 如何从一个范围返回一组天数和小时数?

标签 ruby ruby-on-rails-3

如何从一个范围返回一组天数和小时数?到目前为止我已经尝试过:

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

最佳答案

使用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},
...

关于ruby - 如何从一个范围返回一组天数和小时数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11680425/

相关文章:

ruby-on-rails - ruby 版本之间的时区解析差异

ruby-on-rails - 缺少 :id routes on resource creation

ruby-on-rails - 使用 Postgres 函数作为 ActiveRecord 模型

ruby-on-rails-3 - 当你已经可以通过父级保存时,为什么要使用 "accepts_nested_attributes_for"呢?

html - 即使在添加 btn 类后,bootstrap 提交按钮仍显示蓝色

mysql - Rails session 存储应该使用什么方法?如何决定?

ruby-on-rails - 将对象数组展平、排序并将其映射到哈希数组(带有一些折叠值)

ruby-on-rails - Ruby on Rails 无法识别路线

ruby-on-rails - rails : Having problems with follow and followed system

ruby-on-rails - 管理员授权大礼包