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
-
.included(base) ⇒ Object
:nodoc:.
Instance Method Summary collapse
-
#advance(options) ⇒ Object
Uses Date to provide precise Time calculations for years, months, and days.
-
#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!.
-
#beginning_of_day ⇒ Object
(also: #midnight, #at_midnight, #at_beginning_of_day)
Returns a new DateTime representing the start of the day (0:00).
-
#change(options) ⇒ Object
Returns a new DateTime where one or more of the elements have been changed according to the
options
parameter. -
#compare_with_coercion(other) ⇒ Object
Layers additional behavior on DateTime#<=> so that Time and ActiveSupport::TimeWithZone instances can be compared with a DateTime.
-
#end_of_day ⇒ Object
Returns a new DateTime representing the end of the day (23:59:59).
-
#seconds_since_midnight ⇒ Object
Seconds since midnight: DateTime.now.seconds_since_midnight.
-
#since(seconds) ⇒ Object
(also: #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!.
-
#utc ⇒ Object
(also: #getutc)
Adjusts DateTime to UTC by adding its offset value; offset is set to 0.
-
#utc? ⇒ Boolean
Returns true if offset == 0.
-
#utc_offset ⇒ Object
Returns the offset value in seconds.
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() d = to_date.advance() datetime_advanced_by_date = change(:year => d.year, :month => d.month, :day => d.day) seconds_to_advance = ([:seconds] || 0) + ([:minutes] || 0) * 60 + ([: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_day ⇒ Object 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() ::DateTime.civil( [:year] || self.year, [:month] || self.month, [:day] || self.day, [:hour] || self.hour, [:min] || ([:hour] ? 0 : self.min), [:sec] || (([:hour] || [:min]) ? 0 : self.sec), [:offset] || self.offset, [: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_day ⇒ Object
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_midnight ⇒ Object
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 |
#utc ⇒ Object Also known as: getutc
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
94 95 96 |
# File 'lib/active_support/core_ext/date_time/calculations.rb', line 94 def utc? offset == 0 end |
#utc_offset ⇒ Object
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 |