Ruby on rails 如何在Ruby中输出一年中每个季度的日期范围?

Ruby on rails 如何在Ruby中输出一年中每个季度的日期范围?,ruby-on-rails,ruby,ruby-on-rails-3,Ruby On Rails,Ruby,Ruby On Rails 3,多亏了这个板上的一些人,我才想出了一个函数,可以返回多个日期范围: 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 2

多亏了这个板上的一些人,我才想出了一个函数,可以返回多个日期范围:

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
]
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
(注意:在这种情况下,如果一个月有30天或31天并不重要。)


感谢所有能提供帮助的人。

这样的事情怎么样:

> 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

像这样的东西怎么样:

> 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

您可以使用
季度开始
季度结束
来定义季度

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

((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]

您可以使用
季度开始
季度结束
来定义季度

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

((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]
我会这样做:

# => 

[
  01 Oct 2013..31 Dec 2013,
  01 Jul 2013..31 Sep 2013,
  01 Apr 2013..31 Jun 2013,
  01 Jan 2013..31 Mar 2013
]
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
需要“日期”
def宿舍(y)
q=[]
(1..4)每个人都做|
q我会做一些类似的事情:

# => 

[
  01 Oct 2013..31 Dec 2013,
  01 Jul 2013..31 Sep 2013,
  01 Apr 2013..31 Jun 2013,
  01 Jan 2013..31 Mar 2013
]
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
需要“日期”
def宿舍(y)
q=[]
(1..4)每个人都做|
q这应该有效(基于
月份范围,即上个季度排在第一位):

或者更详细一点,也许更容易理解:

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
这应该有效(基于
月份范围
,即最后一个季度排在第一位):

或者更详细一点,也许更容易理解:

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

出于好奇,你为什么把年份定义为一个返回数组的函数,而不是仅仅做
years=[2013,2012,2011,2010,2009]
?因为我还在学习Ruby:-)好的,我会相应地调整它。这是一个很好的理由。你尝试了什么?“包括尝试过的解决方案、它们不起作用的原因以及预期结果。另请参见:”。你的问题可以用一个非常相似的算法来回答。而且,11月或9月没有31天;您期望的输出准确地反映您的需求是很重要的。潜在的回答者会根据您的规范编写代码,无论是对是错。出于好奇,为什么您将年份定义为一个返回数组的函数,而不是只执行
years=[2013、2012、2011、2010、2009]
?因为我仍在学习Ruby:-)好的,我们会相应地调整它。这是一个非常好的理由。您尝试了什么?“包括尝试过的解决方案、它们不起作用的原因以及预期结果。另请参见:”。你的问题可以用一个非常相似的算法来回答。而且,11月或9月没有31天;您期望的输出准确地反映您的需求是很重要的。潜在的回答者将根据您的规范编写代码,无论是对是错。非常感谢。非常感谢。我更喜欢非详细版本:-)我更喜欢非详细版本:-)非常感谢您的帮助。非常感谢您的帮助。