在 Ruby 1.9 中,我在 Range 上添加了我自己的方法来遍历时间范围:
class Range
def time_step(step, &block)
return enum_for(:time_step, step) unless block_given?
start_time, end_time = first, last
begin
yield(start_time)
end while (start_time += step) <= end_time
end
end
然后,您可以这样调用,例如(我的示例使用 Rails 特定方法:15.minutes):
irb(main):001:0> (1.hour.ago..Time.current).time_step(15.minutes) { |time| puts time }
2012-07-01 21:07:48 -0400
2012-07-01 21:22:48 -0400
2012-07-01 21:37:48 -0400
2012-07-01 21:52:48 -0400
2012-07-01 22:07:48 -0400
=> nil
irb(main):002:0> (1.hour.ago..Time.current).time_step(15.minutes).map { |time| time.to_s(:short) }
=> ["01 Jul 21:10", "01 Jul 21:25", "01 Jul 21:40", "01 Jul 21:55", "01 Jul 22:10"]
请注意,此方法使用 Ruby 1.9 约定,如果没有给出块,枚举方法返回一个枚举器,这允许您将枚举器串在一起。
更新
我已将 Range#time_step 方法添加到我的个人core_extensions
"gem"中。如果您想在 Rails 项目中使用它,只需将以下内容添加到您的 Gemfile 中:
gem 'core_extensions', github: 'pdobb/core_extensions'