13

ある月の範囲で月ごとにログファイルを作成する必要があります。したがって、指定された範囲内のすべての [年、月] タプルが必要です

日付をどのように反復しますか?

毎日反復する必要がある場合、どうすればこれを行うことができますか?

4

7 に答える 7

3

RubyDateは、連続する日の生成をサポートし、next_month数か月にわたって効率的に反復するために使用できる方法を提供します。

入力の精度に適応する一般的な方法は次のとおりです。

require 'date'

def date_tuples(from,to)
  prec   = from.size
  start  = Date.new(*from)
  finish = Date.new(*to)

  filter_on = [:day,:mon].first(3-prec)
  filter = ->(d) { filter_on.all? {|attr| d.send(attr) == 1 } }

  (start..finish)
    .select(&filter)
    .map { |d| [d.year,d.mon,d.day].first(prec) }
end

[7] pry(main)> date_tuples([2012],[2015])
=> [[2012], [2013], [2014], [2015]]
[8] pry(main)> date_tuples([2012,10],[2013,3])
=> [[2012, 10], [2012, 11], [2012, 12], [2013, 1], [2013, 2], [2013, 3]]
[9] pry(main)> date_tuples([2012,10,25],[2012,11,6])
=> [[2012, 10, 25],
 [2012, 10, 26],
 [2012, 10, 27],
 [2012, 10, 28],
 [2012, 10, 29],
 [2012, 10, 30],
 [2012, 10, 31],
 [2012, 11, 1],
 [2012, 11, 2],
 [2012, 11, 3],
 [2012, 11, 4],
 [2012, 11, 5],
 [2012, 11, 6]]
于 2013-03-21T21:28:13.213 に答える
1

範囲内のすべての [年、月] タプルのリストを生成するために、このソリューションを思いつきました。

first=[2012,10]
last=[2013,03]
(first[0]..last[0]).to_a.product((1..12).to_a).select{|ym|(first..last).cover?(ym)}
=> [[2012, 10], [2012, 11], [2012, 12], [2013, 1], [2013, 2], [2013, 3]]
于 2013-03-21T20:40:41.157 に答える