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. -
#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!.
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() 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!
51 52 53 |
# File 'lib/active_support/core_ext/date_time/calculations.rb', line 51 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)
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() ::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 |
#end_of_day ⇒ Object
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_midnight ⇒ Object
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 |