如何计算日期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
答案 0 :(得分:7)
ActiveSupport仅提供beginning_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
答案 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月初到3月底
- 第二季度:从4月初到6月底
- 第三季度:从7月初到9月底
- 第四季度:从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
在某些地方有点脏,但我认为它应该给你一个良好的开端。