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.


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

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!


72
73
74
# File 'lib/active_support/core_ext/date_time/calculations.rb', line 72

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)


84
85
86
# File 'lib/active_support/core_ext/date_time/calculations.rb', line 84

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.


46
47
48
49
50
51
52
53
54
55
56
57
# File 'lib/active_support/core_ext/date_time/calculations.rb', line 46

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


118
119
120
121
122
# File 'lib/active_support/core_ext/date_time/calculations.rb', line 118

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)


92
93
94
# File 'lib/active_support/core_ext/date_time/calculations.rb', line 92

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

#future?Boolean

Tells whether the DateTime object's datetime lies in the future

Returns:

  • (Boolean)

34
35
36
# File 'lib/active_support/core_ext/date_time/calculations.rb', line 34

def future?
  self > ::DateTime.current
end

#past?Boolean

Tells whether the DateTime object's datetime lies in the past

Returns:

  • (Boolean)

29
30
31
# File 'lib/active_support/core_ext/date_time/calculations.rb', line 29

def past?
  self < ::DateTime.current
end

#seconds_since_midnightObject

Seconds since midnight: DateTime.now.seconds_since_midnight


39
40
41
# File 'lib/active_support/core_ext/date_time/calculations.rb', line 39

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!


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

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

102
103
104
# File 'lib/active_support/core_ext/date_time/calculations.rb', line 102

def utc
  new_offset(0)
end

#utc?Boolean

Returns true if offset == 0

Returns:

  • (Boolean)

108
109
110
# File 'lib/active_support/core_ext/date_time/calculations.rb', line 108

def utc?
  offset == 0
end

#utc_offsetObject

Returns the offset value in seconds


113
114
115
# File 'lib/active_support/core_ext/date_time/calculations.rb', line 113

def utc_offset
  (offset * 86400).to_i
end