Module: DateTimeDiff

Included in:
DateTime, Time
Defined in:
lib/datetime_diff.rb,
lib/datetime_diff/version.rb

Constant Summary collapse

VERSION =
"0.3.6"

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.diff_to_s(mls, format = nil, options) ⇒ Object



5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
# File 'lib/datetime_diff.rb', line 5

def self.diff_to_s mls, format=nil, options

  mls = (mls * 1000).to_i
  s = m = h = d = 0

  if mls >= 1000
    s = (mls-(mls%1000))/1000
    mls = mls%1000
  end

  if s >= 60
    m = (s-(s%60))/60
    s = s%60
  end
  
  if m >= 60
    h = (m-(m%60))/60
    m = m%60
  end

  if h >= 24
    d = (h-(h%24))/24
    h = h%24
  end

  t = {D: d,

    H: h.to_s.rjust(2,"0"),
    h: h.to_s,

    M: m.to_s.rjust(2,"0"),
    mm: m.to_s,

    S: s.to_s.rjust(2,"0"),
    ss: s.to_s,

    m: mls.to_s.rjust(3,"0")}

  if format
    r = ""
    #values = format.scan(/\%\S[\S|\s]{1,3}*?(?!%)/)
    values = format.scan(/\%\w{1,3}/)
    
    zero_left = !options[:zero_left] || false
    
    for xV in values
      number = t[xV.gsub("%","").to_sym].to_i
      zero_left = false if number > 0
      unless zero_left && number == 0
        if values.index(xV) + 1 == values.size
          x = format.scan(/(?<=#{xV})[\s|\S]*?$/)[0]
        else
          x = "#{format.scan(/(?<=#{xV})[\s|\S]*?(?=\%)/)[0]}"
        end
        if x.strip[0] == "[" && x.strip[-1] == "]"
          values_ = x.gsub(/\[|\]/, '').split(',')
          while values_.size < 3
            values_.unshift nil
          end
          if number == 0 && values_[0]
            r += "#{number}#{values_[0]}"
          elsif number == 1 && values_[1]
            r += "#{number}#{values_[1]}"
          elsif number > 1 && values_[2]
            r += "#{number}#{values_[2]}"
          end
        else
          r += "#{number}#{x}"
        end
      else
        zero_left  = true
      end
    end
    r
  else
    r += "#{h} #{h > 1 ? "hours" : "hour"} "
    r += "#{m} #{m > 1 ? "minutes" : "minute"} "
    r += "#{s} #{s > 1 ? "seconds" : "second"} "
    r += "#{mls} #{mls > 1 ? "milliseconds" : "millisecond"} "

    r.strip.gsub(/\s{2,}/," ")
  end
end

Instance Method Details

#diff(dt, format = nil, options = {}) ⇒ Object



88
89
90
91
92
93
94
95
96
# File 'lib/datetime_diff.rb', line 88

def diff dt, format=nil, options = {}
  mls = 0
  if self > dt
    mls = self.to_time.to_f - dt.to_time.to_f
  else
    mls = dt.to_time.to_f - self.to_time.to_f
  end
  DateTimeDiff.diff_to_s mls, format, options
end

#diff_in_mls(dt, format = nil, options = {}) ⇒ Object



97
98
99
100
101
102
103
104
105
# File 'lib/datetime_diff.rb', line 97

def diff_in_mls dt, format=nil, options = {}
  mls = 0
  if self > dt
    mls = self.to_time.to_f - dt.to_time.to_f
  else
    mls = dt.to_time.to_f - self.to_time.to_f
  end
  mls
end