2012-09-22 51 views
13

實施例I有幾個月的數組:的Rails如何創建基於日期範圍

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

結束和開始是日期。

如何基於此範圍創建月份數組?

例子:

我有日期23/1/2012和15/3/2012

月是Januar,Februar和集市。

我想得到這樣["1/1/2012", "1/2/2012", "1/3/2012"]

一個數組,如果範圍是betweeen 25/6/2012到二零一二年十月十日

數組將是:["1/6/2012", "1/7/2012", "1/8/2012", "1/9/2012", "1/10/2012"]

+0

...假設一個月的步驟間隔? –

+0

看看這裏:http://stackoverflow.com/questions/5887756/rails-calculate-date-range-in-months –

+0

我剛剛用例子更新了我的問題。 –

回答

28
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"] 
6

的Rails的ActiveSupport核心擴展包括Date:beginning_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方法以獲取預期的月份格式。

+0

我試過這個沒有運氣。我需要使用它爲我的循環,在這裏看到更多:http://stackoverflow.com/questions/12544533/rails-how-to-create-chart-data-for-each-month-between-2-dates –

+0

它將有助於看到你得到的結果。 – rossta

+0

我已經更新了結果的問題。 –