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