3

日付の四半期の開始日/終了日を計算するにはどうすればよいですか? たとえば、メソッド"2012-10-11"を指定した場合は、次のように返します。{ :begin_date => '2012-10-01', :end_date => '2012-12-31' }

def quarter_dates(date = Date.today)
  # TODO...
  return {
    :begin_date => begin_date,
    :end_date => end_date
  }
end
4

3 に答える 3

7

ActiveSupportbeginning_of_quarterは、次のことを提供しますend_of_quarter

require 'active_support/core_ext/date/calculations'

def quarter_dates(date = Date.today)
  {
    begin_date: date.beginning_of_quarter,
    end_date: date.end_of_quarter
  }
end
于 2012-10-21T19:56:58.490 に答える
3

このようなものが動作するはずです:

def quarter_dates(date = Date.today)
  start_month = date.month - (date.month - 1) % 3
  start_date  = Date.new(date.year, start_month, 1)

  {
    :begin_date => start_date,
    :end_date   => (start_date >> 3) - 1
  }
end

理解を助けるために、次のビットを参照してください。

(1..12).map { |month| month - (month - 1) % 3 }
#=> [1, 1, 1, 4, 4, 4, 7, 7, 7, 10, 10, 10]

日付の演算子は数か月後>>の日付を返し、演算子は1 日前の日付を返します。n- 1

于 2012-10-21T19:46:51.513 に答える
1

参照:

ここで提供される四半期の日付範囲を使用: http://en.wikipedia.org/wiki/Calendar_year

  1. 第1四半期:1月上旬から3月末まで
  2. 第2四半期:4月上旬から6月末まで
  3. 第3四半期:7月上旬から9月末まで
  4. 第4四半期:10月初旬から12月末まで

日付範囲の構文:

簡単な解決策では、次のようなロジックを使用します。

# Is today's date in Q4?

(Date.parse('2012-10-01')..Date.parse('2012-12-31')).cover?(Date.today)

解決:

このロジックに従います。

def quarter_dates(date = Date.today)

  4.times do |i|
    start = Date.parse("#{date.year}-#{i*3+1}-01")
    if (start..(start >> 3 - 1)).cover?(date)
      return {
        :begin_date => start,
        :end_date => (start >> 3) - 1
      }
    end
  end

end

所々少し汚れていますが、有利なスタートが切れると思います。

于 2012-10-21T19:49:17.263 に答える