Continuing my series of "why isn't this in ruby already?", we have some date functions that allow us to add and display the current financial quarter. I have even overridden "strftime" to accept the symbol '%Q' to display the quarter.
class Time
# save the original strftime so we can call it later
alias original_strftime :strftime
# overload strftime to accept '%Q' to display the quarter
def strftime(format)
format = format.gsub('%Q', "Q#{self.quarter.to_s}") if format
self.original_strftime format
end
# create a utc time using the year and financial quarter
def self.utc_fq(year, fq = 1)
self.utc(year, self.quarter_to_month(fq))
end
# create a local time using the year and financial quarter
def self.local_fq(year, fq = 1)
self.local(year, self.quarter_to_month(fq))
end
# turns a financial quarter (1-4) into the first month of that quarter
def self.quarter_to_month(fq)
((fq-1) * 3) + 1
end
# turns a given month (1-12) into the financial quarter
# (1=jan-mar, 2=apr-jun, 3=jul-sep, 4=oct-dec)
def self.month_to_quarter(month)
((month - 1) / 3) + 1
end
# returns the financial quarter of this date
# (1=jan-mar, 2=apr-jun, 3=jul-sep, 4=oct-dec)
def quarter
self.class.month_to_quarter(self.month)
end
end
Example of use:
>> order_fq = Time.utc_fq(order.created_at.year, order.created_at.quarter)
=> Sun Jul 01 00:00:00 UTC 2007
>> p "Order's financial quarter: #{order_fq.strftime("%Y-%Q")}"
"Order's financial quarter: 2007-Q3"
=> nil
No comments:
Post a Comment