File: active_support/core_ext/numeric/time.rb

Overview
Module Structure
Code

Overview

Module Structure

  module: <Toplevel Module>
  module: ActiveSupport#1
  module: CoreExtensions#2
  module: Numeric#3
  module: Time#32
has properties
method: seconds #33
alias: second seconds #36
method: minutes #38
alias: minute minutes #41
method: hours #43
alias: hour hours #46
method: days #48
alias: day days #51
method: weeks #53
alias: week weeks #56
method: fortnights #58
alias: fortnight fortnights #61
method: ago / 1 #64
alias: until ago #69
method: since / 1 #72
alias: from_now since #77

Code

   1  module ActiveSupport #:nodoc:
   2    module CoreExtensions #:nodoc:
   3      module Numeric #:nodoc:
   4        # Enables the use of time calculations and declarations, like 45.minutes + 2.hours + 4.years.
   5        #
   6        # These methods use Time#advance for precise date calculations when using from_now, ago, etc. 
   7        # as well as adding or subtracting their results from a Time object. For example:
   8        #
   9        #   # equivalent to Time.now.advance(:months => 1)
  10        #   1.month.from_now
  11        #
  12        #   # equivalent to Time.now.advance(:years => 2)
  13        #   2.years.from_now
  14        #
  15        #   # equivalent to Time.now.advance(:months => 4, :years => 5)
  16        #   (4.months + 5.years).from_now
  17        # 
  18        # While these methods provide precise calculation when used as in the examples above, care
  19        # should be taken to note that this is not true if the result of `months', `years', etc is
  20        # converted before use:
  21        #
  22        #   # equivalent to 30.days.to_i.from_now
  23        #   1.month.to_i.from_now
  24        #
  25        #   # equivalent to 365.25.days.to_f.from_now
  26        #   1.year.to_f.from_now
  27        #
  28        # In such cases, Ruby's core 
  29        # Date[http://stdlib.rubyonrails.org/libdoc/date/rdoc/index.html] and 
  30        # Time[http://stdlib.rubyonrails.org/libdoc/time/rdoc/index.html] should be used for precision
  31        # date and time arithmetic
  32        module Time
  33          def seconds
  34            ActiveSupport::Duration.new(self, [[:seconds, self]])
  35          end
  36          alias :second :seconds
  37 
  38          def minutes
  39            ActiveSupport::Duration.new(self * 60, [[:seconds, self * 60]])
  40          end
  41          alias :minute :minutes  
  42          
  43          def hours
  44            ActiveSupport::Duration.new(self * 3600, [[:seconds, self * 3600]])
  45          end
  46          alias :hour :hours
  47          
  48          def days
  49            ActiveSupport::Duration.new(self * 24.hours, [[:days, self]])
  50          end
  51          alias :day :days
  52 
  53          def weeks
  54            ActiveSupport::Duration.new(self * 7.days, [[:days, self * 7]])
  55          end
  56          alias :week :weeks
  57          
  58          def fortnights
  59            ActiveSupport::Duration.new(self * 2.weeks, [[:days, self * 14]])
  60          end
  61          alias :fortnight :fortnights
  62          
  63          # Reads best without arguments:  10.minutes.ago
  64          def ago(time = ::Time.now)
  65            time - self
  66          end
  67 
  68          # Reads best with argument:  10.minutes.until(time)
  69          alias :until :ago
  70 
  71          # Reads best with argument:  10.minutes.since(time)
  72          def since(time = ::Time.now)
  73            time + self
  74          end
  75 
  76          # Reads best without arguments:  10.minutes.from_now
  77          alias :from_now :since
  78        end
  79      end
  80    end
  81  end