2016-08-02 161 views
2

我在示例範圍內爲每個月創建一個範圍。Ruby:按年份和月份分組日期範圍

example_range = (Time.zone.today..2.years.from_now) 

輸出應該像這樣:

=> [Wed, 03 Aug 2016..Wed, 31 Aug 2016, Thu, 01 Sep 2016..Fri, 
30 Sep 2016, Sat, 01 Oct 2016..Mon, 03 Oct 2016, ...] 

目前,我這樣做,不超過一年長範圍工作,因爲分組會把一月'16和1月17日在一個組。

example_range.group_by(&:month).each { |_, month| month.first..month.last } 

我也試過了,但在這出於某種原因紅寶石段錯誤...

example_range.group_by(&:year).map{ |ary| ary.group_by(&:month)} 

有誰知道這樣做的更漂亮(或至少工作)的方式?

+0

1.這應該是一個問題,而不是一個問題的答案。您應該刪除「解決方案」部分。如果您希望說您使用的是特定解決方案,請將其作爲對適用答案的評論。如果您想自己提供答案,請將其作爲答案。這個問題要求一個例子。當你給出一個例子顯示期望或期望的結果併爲每個輸入對象分配一個變量(例如'arr = [1,2,3]'),這樣讀者就可以在回答和註釋中引用這些變量,而不是在他們的答案。 –

+0

感謝@CarySwoveland,我改進了我的問題。 – andialles

+0

好得多!... –

回答

2

這是怎麼回事:

example_range.group_by {|date| [date.year, date.month] }.map {|_, month| month.first..month.last } 

如果您使用的是Active支持(導軌),這也將工作:

example_range.group_by(&:beginning_of_month).map {|_, month| month.first..month.last } 
+0

我最終這樣做了: 'example_range.group_by(&:beginning_of_month).each {| _,month | month.first..month.last}' – andialles

0

最好的解決辦法,我認爲是這樣的:

example_range.group_by {|date| date.month.to_s + "-" + date.year.to_s} 

你可以調整你需要的方式。

+0

謝謝,那是訣竅 – andialles

+0

不客氣:)) – rneves