lib/rufus/otime.rb in rufus-scheduler-1.0.12 vs lib/rufus/otime.rb in rufus-scheduler-1.0.13
- old
+ new
@@ -1,375 +1,3 @@
-#
-#--
-# Copyright (c) 2005-2008, John Mettraux, jmettraux@gmail.com
-#
-# Permission is hereby granted, free of charge, to any person obtaining a copy
-# of this software and associated documentation files (the "Software"), to deal
-# in the Software without restriction, including without limitation the rights
-# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-# copies of the Software, and to permit persons to whom the Software is
-# furnished to do so, subject to the following conditions:
-#
-# The above copyright notice and this permission notice shall be included in
-# all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-# THE SOFTWARE.
-#++
-#
-#
-# "hecho en Costa Rica"
-#
-# john.mettraux@openwfe.org
-#
-
-require 'date'
-#require 'parsedate'
-
-
-module Rufus
-
- #TIME_FORMAT = "%Y-%m-%d %H:%M:%S"
-
- #
- # Returns the current time as an ISO date string
- #
- def Rufus.now
-
- to_iso8601_date(Time.new())
- end
-
- #
- # As the name implies.
- #
- def Rufus.to_iso8601_date (date)
-
- if date.kind_of? Float
- date = to_datetime(Time.at(date))
- elsif date.kind_of? Time
- date = to_datetime(date)
- elsif not date.kind_of? Date
- date = DateTime.parse(date)
- end
-
- s = date.to_s # this is costly
- s[10] = " "
-
- s
- end
-
- #
- # the old method we used to generate our ISO datetime strings
- #
- def Rufus.time_to_iso8601_date (time)
-
- s = time.getutc().strftime(TIME_FORMAT)
- o = time.utc_offset / 3600
- o = o.to_s + "00"
- o = "0" + o if o.length < 4
- o = "+" + o unless o[0..1] == '-'
-
- s + " " + o.to_s
- end
-
- #
- # Returns a Ruby time
- #
- def Rufus.to_ruby_time (iso_date)
-
- DateTime.parse(iso_date)
- end
-
- #def Rufus.parse_date (date)
- #end
-
- #
- # equivalent to java.lang.System.currentTimeMillis()
- #
- def Rufus.current_time_millis
-
- (Time.new.to_f * 1000).to_i
- end
-
- #
- # Turns a string like '1m10s' into a float like '70.0', more formally,
- # turns a time duration expressed as a string into a Float instance
- # (millisecond count).
- #
- # w -> week
- # d -> day
- # h -> hour
- # m -> minute
- # s -> second
- # M -> month
- # y -> year
- # 'nada' -> millisecond
- #
- # Some examples :
- #
- # Rufus.parse_time_string "500" # => 0.5
- # Rufus.parse_time_string "1000" # => 1.0
- # Rufus.parse_time_string "1h" # => 3600.0
- # Rufus.parse_time_string "1h10s" # => 3610.0
- # Rufus.parse_time_string "1w2d" # => 777600.0
- #
- def Rufus.parse_time_string (string)
-
- string = string.strip
-
- index = -1
- result = 0.0
-
- number = ""
-
- loop do
-
- index = index + 1
-
- if index >= string.length
- result = result + (Float(number) / 1000.0) if number.length > 0
- break
- end
-
- c = string[index, 1]
-
- #if is_digit?(c)
- if (c >= "0" and c <= "9")
- number = number + c
- next
- end
-
- value = Integer(number)
- number = ""
-
- multiplier = DURATIONS[c]
-
- raise "unknown time char '#{c}'" \
- if not multiplier
-
- result = result + (value * multiplier)
- end
-
- result
- end
-
- class << self
- alias_method :parse_duration_string, :parse_time_string
- end
-
- #
- # Returns true if the character c is a digit
- #
- # (probably better served by a regex)
- #
- def Rufus.is_digit? (c)
-
- return false if not c.kind_of?(String)
- return false if c.length > 1
- (c >= "0" and c <= "9")
- end
-
- #
- # conversion methods between Date[Time] and Time
-
- #
- # Ruby Cookbook 1st edition p.111
- # http://www.oreilly.com/catalog/rubyckbk/
- # a must
- #
-
- #
- # converts a Time instance to a DateTime one
- #
- def Rufus.to_datetime (time)
-
- s = time.sec + Rational(time.usec, 10**6)
- o = Rational(time.utc_offset, 3600 * 24)
-
- begin
-
- DateTime.new(
- time.year,
- time.month,
- time.day,
- time.hour,
- time.min,
- s,
- o)
-
- rescue Exception => e
-
- DateTime.new(
- time.year,
- time.month,
- time.day,
- time.hour,
- time.min,
- time.sec,
- time.utc_offset)
- end
- end
-
- def Rufus.to_gm_time (dtime)
-
- to_ttime(dtime.new_offset, :gm)
- end
-
- def Rufus.to_local_time (dtime)
-
- to_ttime(dtime.new_offset(DateTime.now.offset-offset), :local)
- end
-
- def Rufus.to_ttime (d, method)
-
- usec = (d.sec_fraction * 3600 * 24 * (10**6)).to_i
- Time.send(method, d.year, d.month, d.day, d.hour, d.min, d.sec, usec)
- end
-
- #
- # Turns a number of seconds into a a time string
- #
- # Rufus.to_duration_string 0 # => '0s'
- # Rufus.to_duration_string 60 # => '1m'
- # Rufus.to_duration_string 3661 # => '1h1m1s'
- # Rufus.to_duration_string 7 * 24 * 3600 # => '1w'
- # Rufus.to_duration_string 30 * 24 * 3600 + 1 # => "4w2d1s"
- #
- # It goes from seconds to the year. Months are not counted (as they
- # are of variable length). Weeks are counted.
- #
- # For 30 days months to be counted, the second parameter of this
- # method can be set to true.
- #
- # Rufus.to_time_string 30 * 24 * 3600 + 1, true # => "1M1s"
- #
- # (to_time_string is an alias for to_duration_string)
- #
- # If a Float value is passed, milliseconds will be displayed without
- # 'marker'
- #
- # Rufus.to_duration_string 0.051 # =>"51"
- # Rufus.to_duration_string 7.051 # =>"7s51"
- # Rufus.to_duration_string 0.120 + 30 * 24 * 3600 + 1 # =>"4w2d1s120"
- #
- # (this behaviour mirrors the one found for parse_time_string()).
- #
- # Options are :
- #
- # * :months, if set to true, months (M) of 30 days will be taken into
- # account when building up the result
- # * :drop_seconds, if set to true, seconds and milliseconds will be trimmed
- # from the result
- #
- def Rufus.to_duration_string (seconds, options={})
-
- return (options[:drop_seconds] ? '0m' : '0s') if seconds <= 0
-
- h = to_duration_hash seconds, options
-
- s = DU_KEYS.inject("") do |r, key|
- count = h[key]
- count = nil if count == 0
- r << "#{count}#{key}" if count
- r
- end
-
- ms = h[:ms]
- s << ms.to_s if ms
-
- s
- end
-
- class << self
- alias_method :to_time_string, :to_duration_string
- end
-
- #
- # Turns a number of seconds (integer or Float) into a hash like in :
- #
- # Rufus.to_duration_hash 0.051
- # # => { :ms => "51" }
- # Rufus.to_duration_hash 7.051
- # # => { :s => 7, :ms => "51" }
- # Rufus.to_duration_hash 0.120 + 30 * 24 * 3600 + 1
- # # => { :w => 4, :d => 2, :s => 1, :ms => "120" }
- #
- # This method is used by to_duration_string (to_time_string) behind
- # the scene.
- #
- # Options are :
- #
- # * :months, if set to true, months (M) of 30 days will be taken into
- # account when building up the result
- # * :drop_seconds, if set to true, seconds and milliseconds will be trimmed
- # from the result
- #
- def Rufus.to_duration_hash (seconds, options={})
-
- h = {}
-
- if seconds.is_a?(Float)
- h[:ms] = (seconds % 1 * 1000).to_i
- seconds = seconds.to_i
- end
-
- if options[:drop_seconds]
- h.delete :ms
- seconds = (seconds - seconds % 60)
- end
-
- durations = options[:months] ? DURATIONS2M : DURATIONS2
-
- durations.each do |key, duration|
-
- count = seconds / duration
- seconds = seconds % duration
-
- h[key.to_sym] = count if count > 0
- end
-
- h
- end
-
- #
- # Ensures that a duration is a expressed as a Float instance.
- #
- # duration_to_f("10s")
- #
- # will yield 10.0
- #
- def Rufus.duration_to_f (s)
-
- return s if s.kind_of?(Float)
- return parse_time_string(s) if s.kind_of?(String)
- Float(s.to_s)
- end
-
- protected
-
- DURATIONS2M = [
- [ "y", 365 * 24 * 3600 ],
- [ "M", 30 * 24 * 3600 ],
- [ "w", 7 * 24 * 3600 ],
- [ "d", 24 * 3600 ],
- [ "h", 3600 ],
- [ "m", 60 ],
- [ "s", 1 ]
- ]
- DURATIONS2 = DURATIONS2M.dup
- DURATIONS2.delete_at 1
-
- DURATIONS = DURATIONS2M.inject({}) do |r, (k, v)|
- r[k] = v
- r
- end
-
- DU_KEYS = DURATIONS2M.collect { |k, v| k.to_sym }
-
-end
+require 'rufus/scheduler/otime'