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,
  ....
]

では、年の 4四半期も返す方法はありますか?

したがって、出力は次のようになります。

# => 

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

(注: この場合、1 か月が 30 日か 31 日かは問題ではありません。)

助けてくれる人に感謝します。

4

4 に答える 4

4

beginning_of_quarterおよびを使用しend_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 に答える