module DateTimeDiff

Constants

VERSION

Public Class Methods

diff_to_s(mls, format=nil, options) click to toggle source
# 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

Public Instance Methods

diff(dt, format=nil, options = {}) click to toggle source
# 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 = {}) click to toggle source
# 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