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
# File 'lib/active_support/core_ext/date_time/calculations.rb', line 8

def self.included(base) #:nodoc:
  base.extend ClassMethods
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.



42
43
44
45
46
47
# File 'lib/active_support/core_ext/date_time/calculations.rb', line 42

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!



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

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)



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

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.



27
28
29
30
31
32
33
34
35
36
37
38
# File 'lib/active_support/core_ext/date_time/calculations.rb', line 27

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

#end_of_dayObject

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



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

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

#seconds_since_midnightObject

Seconds since midnight: DateTime.now.seconds_since_midnight



20
21
22
# File 'lib/active_support/core_ext/date_time/calculations.rb', line 20

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!



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

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