40

Ruby 1.9.x / Rails 3.2.xで、1時間のステップで2つのDateTimeオブジェクト間を反復処理する効率的な方法を探しています。

('2013-01-01'.to_datetime .. '2013-02-01'.to_datetime).step(1.hour) do |date|
   ...
end

これに関する問題は秒数だけであることを理解しています1.hourが、それをDateTimeオブジェクトに変換して、ステップとして使用しようとしても機能しません。

「ルビーシュガーに注意」を見ました。下部の近くに、DateTimeには直接stepメソッドがあることが記載されています。DateTimeオブジェクトで実行してこれを確認しましたが、RubyまたはRailsのドキュメントのいずれにもDateTimeのmethodsドキュメントが見つかりません。step

4

4 に答える 4

70

「範囲から日と時間の配列を返すにはどうすればよいですか? 」の私の答えと同様に、トリックは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()ローカルタイムゾーンを使用して変換するため、次を使用してUTCを指定することをお勧めします。Time.at(date).utc

于 2013-01-28T04:05:15.817 に答える
17

遅いかもしれませんが、Rails がなくても実行できます。

ルビー 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

お役に立てば幸いです。

于 2015-05-01T11:08:28.637 に答える
5

ここに私が最近思いついたものがあります:

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] 
于 2014-08-20T21:47:02.090 に答える
0

これが役立つかどうかは完全にはわかりませんが、このスタックオーバーフローページを確認してください。質問は似ているようです。

日、時間、分で時間の差を計算します

于 2013-01-28T03:58:07.160 に答える