@@ -32,21 +32,21 @@ def self.leap_days(year)
32
32
#
33
33
34
34
# define month lengths
35
- MAX_DAYS = 31
36
- WEE_DAYS = 30
37
- LEP_DAYS = 29
38
- FEB_DAYS = 28
35
+ MON31 = 31 # Jan, Mar, May, Jul, Aug, Oct, Dec
36
+ MON30 = 30 # Apr, Jun, Sep, Nov
37
+ MON29 = 29 # Feb (leap)
38
+ MON28 = 28 # Feb
39
39
40
40
# define lookup by month number, zero-indexed
41
41
MONTH_DAYS =
42
- [ MAX_DAYS , FEB_DAYS , MAX_DAYS , WEE_DAYS , MAX_DAYS , WEE_DAYS ,
43
- MAX_DAYS , MAX_DAYS , WEE_DAYS , MAX_DAYS , WEE_DAYS , MAX_DAYS ] . freeze
42
+ [ MON31 , MON28 , MON31 , MON30 , MON31 , MON30 ,
43
+ MON31 , MON31 , MON30 , MON31 , MON30 , MON31 ] . freeze
44
44
NUM_MONTHS = 12 # MONTH_DAYS.size
45
45
46
46
# derive CUMULATIVE_DAYS from MONTH_DAYS, zero-indexed
47
47
CUMULATIVE_DAYS = MONTH_DAYS . reduce ( [ 0 ] ) { |acc , days |
48
48
acc + [ acc . last + days ]
49
- }
49
+ } # [0, 31, 59, 90, 120, ... 365]
50
50
ANNUAL_DAYS = CUMULATIVE_DAYS . pop # 365
51
51
LEAP_YEAR_DAYS = ANNUAL_DAYS + 1 # 366
52
52
CUMULATIVE_DAYS . freeze
@@ -56,7 +56,7 @@ def self.leap_days(year)
56
56
57
57
# implementation considerations
58
58
MIN_Y , MIN_M , MIN_D = 1 , 1 , 1
59
- MAX_Y , MAX_M , MAX_D = 9999 , NUM_MONTHS , MAX_DAYS
59
+ MAX_Y , MAX_M , MAX_D = 9999 , NUM_MONTHS , MON31
60
60
EPOCH_Y , EPOCH_M , EPOCH_D = 1 , 1 , 1
61
61
62
62
#
@@ -66,13 +66,13 @@ def self.leap_days(year)
66
66
# perform lookup by month number and year, one-indexed, with leap days
67
67
def self . month_days ( month , year )
68
68
( month == 2 and self . leap_year? ( year ) ) ?
69
- LEP_DAYS : MONTH_DAYS . fetch ( month - 1 )
69
+ MON29 : MONTH_DAYS . fetch ( month - 1 )
70
70
end
71
71
72
72
# given a day count, what is the current month?
73
73
# despite leap years, never guess too low, only too high
74
74
def self . guess_month ( days )
75
- ( days / WEE_DAYS + 1 ) . clamp ( EPOCH_M , NUM_MONTHS )
75
+ ( days / MON30 + 1 ) . clamp ( MIN_M , MAX_M )
76
76
end
77
77
78
78
# perform lookup by month number and year, one-indexed, with leap days
0 commit comments