Module: NightTime::Calculate

Included in:
NightTime
Defined in:
lib/night-time/calculate.rb

Instance Method Summary collapse

Instance Method Details

#mktime(*args) ⇒ Object



19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
# File 'lib/night-time/calculate.rb', line 19

def mktime(*args)
  year, mon, day, hour, min, sec, usec = args
  extra = 0
  if hour.to_i >= 24 or min.to_i >= 60 or sec.to_i > 60
    hour, min, sec, extra = mod_midnight(hour, min, sec)
  end

  begin
    Time.mktime(year, mon, day, hour, min, sec, usec) + extra
  rescue ArgumentError
    if day < 28
      raise
    else
      extra += (day - 28) * 86400
      day = 28
      Time.mktime(year, mon, day, hour, min, sec, usec) + extra
    end
  end
end

#mod_midnight(hour, min, sec) ⇒ Object



5
6
7
8
9
10
11
12
13
14
15
16
17
# File 'lib/night-time/calculate.rb', line 5

def mod_midnight(hour, min, sec)
  extra = 0

  squeeze = lambda{|val, max, unit, extra|
    num, new_val = val.divmod(max)
    [new_val, extra + max*num*unit]
  }
  sec , extra = squeeze.call(sec.to_i , 60, 1    , extra)
  min , extra = squeeze.call(min.to_i , 60, 60   , extra)
  hour, extra = squeeze.call(hour.to_i, 24, 60*60, extra)

  return [hour, min, sec, extra]
end

#parse(text) ⇒ Object



39
40
41
# File 'lib/night-time/calculate.rb', line 39

def parse(text)
  mktime(*ParseDate.parsedate(text)[0,7])
end