Не знаю, полностью ли я понял вашу проблему, но некоторые из следующих могут быть полезны. Я воспользовался расширениями на дату, предоставленными в ActiveSupport:
d1 = Date.parse("20070617") # => Sun, 17 Jun 2007
d2 = Date.parse("20090529") #=> Fri, 29 May 2009
eom = d1.end_of_month #=> Sat, 30 Jun 2007
mth_ends = [eom] #=> [Sat, 30 Jun 2007]
while eom < d2
eom = eom.advance(:days => 1).end_of_month
mth_ends << eom
end
yrs = mth_ends.group_by{|me| me.year}
В последней строке используется другое удобное расширение: Array # group_by, которое выполняет почти то же, что и обещает.
d1.year.upto(d2.year) do |yr|
puts "#{yrs[yr].min}, #{yrs[yr].max}"
end
2007-06-30, 2007-12-31
2008-01-31, 2008-12-31
2009-01-31, 2009-05-31
Я не знаю, являются ли начальная / конечная точки желаемыми, но вы должны быть в состоянии выяснить, что еще вам может понадобиться.
НТН