我正在寻找一种有效的方法,在Ruby 1.9.x / Rails 3.2.x中,在两个DateTime对象之间进行迭代,步长为一小时。
('2013-01-01'.to_datetime .. '2013-02-01'.to_datetime).step(1.hour) do |date|
...
end
我理解这个问题是1.hour
只是秒数,但我尝试将其转换为DateTime对象并将其用作步骤也不起作用。
我看了" Beware of Ruby Sugar"。它在底部附近提到DateTime有一个直接的step
方法。我通过在DateTime对象上运行methods
来确认这一点,但我在DateTime中找不到step
上的任何文档,无论是Ruby还是Rails'文档。
答案 0 :(得分:53)
与我在“How do I return an array of days and hours from a range?”中的回答类似,诀窍是使用to_i
来处理自纪元以来的秒数:
('2013-01-01'.to_datetime.to_i .. '2013-02-01'.to_datetime.to_i).step(1.hour) do |date|
puts Time.at(date)
end
请注意Time.at()
使用您的本地时区进行转换,因此您可能希望使用Time.at(date).utc
指定UTC
答案 1 :(得分:12)
也许迟到了,但你可以在没有Rails的情况下做到这一点,例如步入小时:
Ruby 2.1.0
require 'time'
hour_step = (1.to_f/24)
date_time = DateTime.new(2015,4,1,00,00)
date_time_limit = DateTime.new(2015,4,1,6,00)
date_time.step(date_time_limit,hour_step).each{|e| puts e}
2015-04-01T00:00:00+00:00
2015-04-01T01:00:00+00:00
2015-04-01T02:00:00+00:00
2015-04-01T03:00:00+00:00
2015-04-01T04:00:00+00:00
2015-04-01T05:00:00+00:00
2015-04-01T06:00:00+00:00
或分钟:
#one_minute_step = (1.to_f/24/60)
fifteen_minutes_step = (1.to_f/24/4)
date_time = DateTime.new(2015,4,1,00,00)
date_time_limit = DateTime.new(2015,4,1,00,59)
date_time.step(date_time_limit,fifteen_minutes_step).each{|e| puts e}
2015-04-01T00:00:00+00:00
2015-04-01T00:15:00+00:00
2015-04-01T00:30:00+00:00
2015-04-01T00:45:00+00:00
我希望它有所帮助。
答案 2 :(得分:4)
这是我最近想出的一些事情:
require 'active_support/all'
def enumerate_hours(start, end_)
Enumerator.new { |y| loop { y.yield start; start += 1.hour } }.take_while { |d| d < end_ }
end
enumerate_hours(DateTime.now.utc, DateTime.now.utc + 1.day)
# returns [Wed, 20 Aug 2014 21:40:46 +0000, Wed, 20 Aug 2014 22:40:46 +0000, Wed, 20 Aug 2014 23:40:46 +0000, Thu, 21 Aug 2014 00:40:46 +0000, Thu, 21 Aug 2014 01:40:46 +0000, Thu, 21 Aug 2014 02:40:46 +0000, Thu, 21 Aug 2014 03:40:46 +0000, Thu, 21 Aug 2014 04:40:46 +0000, Thu, 21 Aug 2014 05:40:46 +0000, Thu, 21 Aug 2014 06:40:46 +0000, Thu, 21 Aug 2014 07:40:46 +0000, Thu, 21 Aug 2014 08:40:46 +0000, Thu, 21 Aug 2014 09:40:46 +0000, Thu, 21 Aug 2014 10:40:46 +0000, Thu, 21 Aug 2014 11:40:46 +0000, Thu, 21 Aug 2014 12:40:46 +0000, Thu, 21 Aug 2014 13:40:46 +0000, Thu, 21 Aug 2014 14:40:46 +0000, Thu, 21 Aug 2014 15:40:46 +0000, Thu, 21 Aug 2014 16:40:46 +0000, Thu, 21 Aug 2014 17:40:46 +0000, Thu, 21 Aug 2014 18:40:46 +0000, Thu, 21 Aug 2014 19:40:46 +0000, Thu, 21 Aug 2014 20:40:46 +0000, Thu, 21 Aug 2014 21:40:46 +0000]
答案 3 :(得分:0)
我不完全确定这是否会有所帮助,但请查看此堆栈溢出页面,问题似乎相似。