获取季度的开始/结束日期

时间:2012-10-21 19:23:40

标签: ruby date

如何计算日期quarter begin/end dates?如果我提供方法"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

3 个答案:

答案 0 :(得分:7)

ActiveSupport仅提供beginning_of_quarterend_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

答案 1 :(得分: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]

日期的运营商>>将在n个月后返回日期,- 1将返回前一天的日期。

答案 2 :(得分:1)

参考:

使用此处提供的季度日期范围:http://en.wikipedia.org/wiki/Calendar_year

  
      
  1. 第一季度:从1月初到3月底
  2.   
  3. 第二季度:从4月初到6月底
  4.   
  5. 第三季度:从7月初到9月底
  6.   
  7. 第四季度:从10月初到12月底
  8.   

Date& Range语法:

一个简单的解决方案将使用这样的逻辑:

# 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

在某些地方有点脏,但我认为它应该给你一个良好的开端。