2016-08-02 110 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