Подтвердить что ты не робот

Рельсы, как создать массив месяцев в зависимости от диапазона дат

Пример:

  range = start.to_date..(end.to_date + 1.day)

end и start - даты.

Как создать массив месяцев на основе этого диапазона?

Пример:

У меня есть даты 23/1/2012 и 15/3/2012

Месяцами являются Januar, Februar и Marts.

Я хочу получить массив вроде ["1/1/2012", "1/2/2012", "1/3/2012"]

и если диапазон был между 25/6/2012 по 10/10/2012

массив будет: ["1/6/2012", "1/7/2012", "1/8/2012", "1/9/2012", "1/10/2012"]

4b9b3361

Ответ 1

require 'date'

date_from  = Date.parse('2011-10-14')
date_to    = Date.parse('2012-04-30')
date_range = date_from..date_to

date_months = date_range.map {|d| Date.new(d.year, d.month, 1) }.uniq
date_months.map {|d| d.strftime "%d/%m/%Y" }
# => ["01/10/2011", "01/11/2011", "01/12/2011", "01/01/2012",
#     "01/02/2012", "01/03/2012", "01/04/2012"] 

Ответ 2

Rails Расширения ядра ActiveSupport включают в себя метод Date: begin_of_month. Ваша функция может быть записана следующим образом:

def beginning_of_month_date_list(start, finish)
  (start.to_date..finish.to_date).map(&:beginning_of_month).uniq.map(&:to_s)
end

Предостережения: это может быть написано более эффективно, предполагает, что начало и конец находятся в ожидаемом порядке, но в противном случае вы должны дать вам месяцы, которые вы ищете. Вы также можете переписать, чтобы передать символ формата методу #to_s, чтобы получить ожидаемый формат месяца.