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(/\%\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
|