Ruby Date
поддерживает производство последовательные дни и предлагает метод 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]]
Для чего это стоит , если у вас есть доступ к «ActiveSupport» в вашем проекте, «Диапазон» может быть просто расширен для работы с размерами переменных шагов с поддержкой часового пояса (см. http://stackoverflow.com/questions/19093487/ruby-create-range-of -dates/19094504 # ответ-19094504). – captainpete