Module: ActiveSupport::CoreExtensions::DateTime::Calculations

Included in:
DateTime
Defined in:
lib/active_support/core_ext/date_time/calculations.rb

Overview

Enables the use of time calculations within DateTime itself

Defined Under Namespace

Modules: ClassMethods

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.included(base) ⇒ Object

:nodoc:


8
9
10
11
12
13
14
15
# File 'lib/active_support/core_ext/date_time/calculations.rb', line 8

def self.included(base) #:nodoc:
  base.extend ClassMethods
  
  base.class_eval do
    alias_method :compare_without_coercion, :<=>
    alias_method :<=>, :compare_with_coercion
  end
end

Instance Method Details

#advance(options) ⇒ Object

Uses Date to provide precise Time calculations for years, months, and days. The options parameter takes a hash with any of these keys: :years, :months, :weeks, :days, :hours, :minutes, :seconds.


49
50
51
52
53
54
# File 'lib/active_support/core_ext/date_time/calculations.rb', line 49

def advance(options)
  d = to_date.advance(options)
  datetime_advanced_by_date = change(:year => d.year, :month => d.month, :day => d.day)
  seconds_to_advance = (options[:seconds] || 0) + (options[:minutes] || 0) * 60 + (options[:hours] || 0) * 3600
  seconds_to_advance == 0 ? datetime_advanced_by_date : datetime_advanced_by_date.since(seconds_to_advance)
end

#ago(seconds) ⇒ Object

Returns a new DateTime representing the time a number of seconds ago Do not use this method in combination with x.months, use months_ago instead!


58
59
60
# File 'lib/active_support/core_ext/date_time/calculations.rb', line 58

def ago(seconds)
  self.since(-seconds)
end

#beginning_of_dayObject Also known as: midnight, at_midnight, at_beginning_of_day

Returns a new DateTime representing the start of the day (0:00)


70
71
72
# File 'lib/active_support/core_ext/date_time/calculations.rb', line 70

def beginning_of_day
  change(:hour => 0)
end

#change(options) ⇒ Object

Returns a new DateTime where one or more of the elements have been changed according to the options parameter. The time options (hour, minute, sec) reset cascadingly, so if only the hour is passed, then minute and sec is set to 0. If the hour and minute is passed, then sec is set to 0.


32
33
34
35
36
37
38
39
40
41
42
43
# File 'lib/active_support/core_ext/date_time/calculations.rb', line 32

def change(options)
  ::DateTime.civil(
    options[:year]  || self.year,
    options[:month] || self.month,
    options[:day]   || self.day,
    options[:hour]  || self.hour,
    options[:min]   || (options[:hour] ? 0 : self.min),
    options[:sec]   || ((options[:hour] || options[:min]) ? 0 : self.sec),
    options[:offset]  || self.offset,
    options[:start]  || self.start
  )
end

#compare_with_coercion(other) ⇒ Object

Layers additional behavior on DateTime#<=> so that Time and ActiveSupport::TimeWithZone instances can be compared with a DateTime


104
105
106
107
108
# File 'lib/active_support/core_ext/date_time/calculations.rb', line 104

def compare_with_coercion(other)
  other = other.comparable_time if other.respond_to?(:comparable_time)
  other = other.to_datetime unless other.acts_like?(:date)
  compare_without_coercion(other)
end

#end_of_dayObject

Returns a new DateTime representing the end of the day (23:59:59)


78
79
80
# File 'lib/active_support/core_ext/date_time/calculations.rb', line 78

def end_of_day
  change(:hour => 23, :min => 59, :sec => 59)
end

#seconds_since_midnightObject

Seconds since midnight: DateTime.now.seconds_since_midnight


25
26
27
# File 'lib/active_support/core_ext/date_time/calculations.rb', line 25

def seconds_since_midnight
  self.sec + (self.min * 60) + (self.hour * 3600)
end

#since(seconds) ⇒ Object Also known as: in

Returns a new DateTime representing the time a number of seconds since the instance time Do not use this method in combination with x.months, use months_since instead!


64
65
66
# File 'lib/active_support/core_ext/date_time/calculations.rb', line 64

def since(seconds)
  self + Rational(seconds.round, 86400)
end

#utcObject Also known as: getutc

Adjusts DateTime to UTC by adding its offset value; offset is set to 0

Example:

DateTime.civil(2005, 2, 21, 10, 11, 12, Rational(-6, 24))       # => Mon, 21 Feb 2005 10:11:12 -0600
DateTime.civil(2005, 2, 21, 10, 11, 12, Rational(-6, 24)).utc   # => Mon, 21 Feb 2005 16:11:12 +0000

88
89
90
# File 'lib/active_support/core_ext/date_time/calculations.rb', line 88

def utc
  new_offset(0)
end

#utc?Boolean

Returns true if offset == 0

Returns:

  • (Boolean)

94
95
96
# File 'lib/active_support/core_ext/date_time/calculations.rb', line 94

def utc?
  offset == 0
end

#utc_offsetObject

Returns the offset value in seconds


99
100
101
# File 'lib/active_support/core_ext/date_time/calculations.rb', line 99

def utc_offset
  (offset * 86400).to_i
end