21

私が持っている例:

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

end と start は日付です。

この範囲に基づいて月の配列を作成するにはどうすればよいですか?

例:

私は2012年1月23日と2012年3月15日の日付を持っています

月は Januar、Februar、Marts です。

のような配列を取得したい["1/1/2012", "1/2/2012", "1/3/2012"]

範囲が 2012 年 6 月 25 日から 2012 年 10 月 10 日までの場合

配列は次のようになります。["1/6/2012", "1/7/2012", "1/8/2012", "1/9/2012", "1/10/2012"]

4

3 に答える 3

35
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"] 
于 2012-09-22T14:54:29.127 に答える
10

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 メソッドに渡すように書き直して、予想される月のフォーマットを取得することもできます。

于 2012-09-22T13:55:42.393 に答える