10

異なる間隔(毎日、毎週、毎月など)でループしたい日付範囲(から、から)があります

この日付範囲をループするにはどうすればよいですか?

アップデート

あなたの答えをありがとう、私は次のことを思いついた:

interval = 'week' # month, year
start = from
while start < to
  stop  = start.send("end_of_#{interval}")
  if stop > to
    stop = to
  end
  logger.debug "Interval from #{start.inspect} to #{stop.inspect}"
  start = stop.send("beginning_of_#{interval}")
  start += 1.send(interval)
end

これは、週、月、または年の間隔で日付範囲をループし、指定された間隔の開始と終了を尊重します。

私は私の質問でこれについて言及しなかったので、私は正しい方向に私を押しやった答えを選びました。

4

4 に答える 4

7

from日付 + 1.day1.week、または日付1.monthより大きいまでループしtoますか?

 > from = Time.now
 => 2012-05-12 09:21:24 -0400 
 > to = Time.now + 1.month + 2.week + 3.day
 => 2012-06-29 09:21:34 -0400 
 > tmp = from
 => 2012-05-12 09:21:24 -0400 
 > begin
?>   tmp += 1.week
?>   puts tmp
?> end while tmp <= to
2012-05-19 09:21:24 -0400
2012-05-26 09:21:24 -0400
2012-06-02 09:21:24 -0400
2012-06-09 09:21:24 -0400
2012-06-16 09:21:24 -0400
2012-06-23 09:21:24 -0400
2012-06-30 09:21:24 -0400
 => nil 
于 2012-05-12T13:18:39.920 に答える
7

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'
于 2012-07-02T02:42:16.017 に答える
4

succ メソッドは 1.9 の範囲で廃止されました。毎週同じことをしたいので、私はこの解決策にたどり着きました:

  def by_week(start_date, number_of_weeks)
    number_of_weeks.times.inject([]) { |memo, w| memo << start_date + w.weeks }
  end

これは、間隔内の週の配列を返します。何ヶ月も簡単に適応できます。

于 2013-03-22T10:18:01.843 に答える
0

Range オブジェクトに step メソッドがあります。http://ruby-doc.org/core-1.9.3/Range.html#method-i-step

于 2012-05-12T13:24:00.863 に答える