ruby - find start and end of range given a point -
i created basic class right here:
class timeperiod months_per_quarter = 3 quarter_range = { 0 => [1,3], 1 => [4,6], 2 => [7,9], 3 => [10,12] } def self.quarter(month_num) (month_num - 1) / months_per_quarter end def self.quarter_range(month_num) quarter = quarter month_num t1,t2 = quarter_range[quarter] [time.parse(date::monthnames[t1]).beginning_of_month, time.parse(date::monthnames[t2]).end_of_month] end end
it gives me time range quarter, given month provided integer:
> timeutils.quarter_range(time.now.month) => [2015-04-01 00:00:00 -0400, 2015-06-30 23:59:59 -0400]
so works. however, have cheated. had difficulty finding start , end, given, let's say, month 6. hardcoded values in quarter_range constant. want able remove quarter_range constant , find beginning , end (e.g. [4,6]) without it.
so example, if input 3 (march),6 (june),9(september),12(december) passed, know end of quarter, using modulus arithmetic:
3 % 3 => 0 6 % 3 => 0 9 % 3 => 0 12 % 3 => 0
but tricky part given let's 5 (may), how can return [4,6]
?
you can start of quarter this:
def qtr_start(mon) mon - (mon - 1) % months_per_quarter end qtr_start(9) # => 7
the end of quarter plus two:
def qtr_end(mon) qtr_start(mon) + 2 end qtr_end(9) # => 9
put them together:
def qtr_start_end(mon) start = mon - (mon - 1) % months_per_quarter [ start, start + 2 ] end (1..12).each |mon| start_end = qtr_start_end(mon) puts "month #{mon} in quarter #{start_end.inspect}" end # => month 1 in quarter [1, 3] # month 2 in quarter [1, 3] # month 3 in quarter [1, 3] # month 4 in quarter [4, 6] # month 5 in quarter [4, 6] # month 6 in quarter [4, 6] # month 7 in quarter [7, 9] # month 8 in quarter [7, 9] # month 9 in quarter [7, 9] # month 10 in quarter [10, 12] # month 11 in quarter [10, 12] # month 12 in quarter [10, 12]
Comments
Post a Comment