1

感谢这个板上的一些人,我能够想出一个返回多个日期范围的函数:

years = [2013, 2012, 2011, 2010, 2009]

def month_ranges
  years.flat_map { |y|
    12.downto(1).map { |m| Date.new(y,m,1)..Date.new(y,m,-1) }
  }
end

# => 

[
  01 Dec 2013..31 Dec 2013, 
  01 Nov 2013..31 Nov 2013, 
  01 Oct 2013..31 Oct 2013, 
  01 Sep 2013..31 Sep 2013,
  01 Aug 2013..31 Aug 2013,
  ....
]

现在,有没有办法也返回一年的四个季度

所以输出将是这样的:

# => 

[
  01 Oct 2013..31 Dec 2013,
  01 Jul 2013..31 Sep 2013,
  01 Apr 2013..31 Jun 2013,
  01 Jan 2013..31 Mar 2013
]

(注意:在这种情况下,如果一个月有 30 天或 31 天并不重要。)

感谢任何能提供帮助的人。

4

4 回答 4

4

您可以使用beginning_of_quarterend_of_quarter来定义季度。

例如,如果我想根据季度对 date_range 进行分组,我可以执行以下操作:

((Date.today - 1.year)..Date.today).group_by(&:beginning_of_quarter)

在这种情况下,关键是每个季度的开始:

((Date.today - 1.year)..Date.today).group_by(&:beginning_of_quarter).keys
=> [Sun, 01 Jul 2012, Mon, 01 Oct 2012, Tue, 01 Jan 2013, Mon, 01 Apr 2013, Mon, 01 Jul 2013]
于 2013-09-26T14:00:00.770 回答
4

这应该有效(基于month_ranges,即上个季度首先出现):

def quarter_ranges
  years.flat_map { |y|
    3.downto(0).map { |q|
      Date.new(y, q * 3 + 1, 1)..Date.new(y, q * 3 + 3, -1)
    }
  }
end

或者更冗长,也许更容易理解:

def quarter_ranges
  years.flat_map { |y|
    [
      Date.new(y, 10, 1)..Date.new(y, 12, -1),
      Date.new(y,  7, 1)..Date.new(y,  9, -1),
      Date.new(y,  4, 1)..Date.new(y,  6, -1),
      Date.new(y,  1, 1)..Date.new(y,  3, -1)
    ]
  }
end
于 2013-09-26T14:05:01.940 回答
2

像这样的东西怎么样:

> now = Time.now.beginning_of_month
 => 2013-09-01 00:00:00 +0200
> now..(now + 3.months)
 => 2013-09-01 00:00:00 +0200..2013-12-01 00:00:00 +0100
于 2013-09-26T13:41:14.407 回答
1

我会做类似的事情:

require 'date'
def quarters(y)
  q = []
  (1..4).each do |s|
    q << (Date.new(y, s * 3 - 1, 1)..Date.new(y, s * 3, -1))
  end
  return q
end
于 2013-09-26T14:01:45.190 回答