aboutsummaryrefslogtreecommitdiffstats
path: root/activesupport/lib/active_support/core_ext/time/operators.rb
diff options
context:
space:
mode:
authorPablo Herrero <pablodherrero@gmail.com>2015-04-23 16:33:23 -0300
committerPablo Herrero <pablodherrero@gmail.com>2015-05-04 08:06:52 -0300
commitbbe7b7f504ea5010712ee37d84f8c86682dd14f8 (patch)
treebaead3282de4b044960862f81900fddcb3982105 /activesupport/lib/active_support/core_ext/time/operators.rb
parent21c74bd769f6c873453e9244b0de7ced40a532be (diff)
downloadrails-bbe7b7f504ea5010712ee37d84f8c86682dd14f8.tar.gz
rails-bbe7b7f504ea5010712ee37d84f8c86682dd14f8.tar.bz2
rails-bbe7b7f504ea5010712ee37d84f8c86682dd14f8.zip
Replace use of alias chains with prepend at core_ext/date
Diffstat (limited to 'activesupport/lib/active_support/core_ext/time/operators.rb')
-rw-r--r--activesupport/lib/active_support/core_ext/time/operators.rb36
1 files changed, 36 insertions, 0 deletions
diff --git a/activesupport/lib/active_support/core_ext/time/operators.rb b/activesupport/lib/active_support/core_ext/time/operators.rb
new file mode 100644
index 0000000000..161304dcb3
--- /dev/null
+++ b/activesupport/lib/active_support/core_ext/time/operators.rb
@@ -0,0 +1,36 @@
+require 'active_support/core_ext/date_and_time/with_duration'
+
+module ActiveSupport
+ module TimeOperators # :nodoc:
+ include DateAndTime::WithDuration
+
+ # Layers additional behavior on Time#<=> so that DateTime and ActiveSupport::TimeWithZone instances
+ # can be chronologically compared with a Time
+ def <=>(other)
+ # we're avoiding Time#to_datetime and Time#to_time because they're expensive
+ if other.class == Time
+ super
+ elsif other.is_a?(Time)
+ super(other.to_time)
+ else
+ to_datetime <=> other
+ end
+ end
+
+ # Layers additional behavior on Time#eql? so that ActiveSupport::TimeWithZone instances
+ # can be eql? to an equivalent Time
+ def eql?(other)
+ # if other is an ActiveSupport::TimeWithZone, coerce a Time instance from it so we can do eql? comparison
+ other = other.comparable_time if other.respond_to?(:comparable_time)
+ super
+ end
+
+ # Time#- can also be used to determine the number of seconds between two Time instances.
+ # We're layering on additional behavior so that ActiveSupport::TimeWithZone instances
+ # are coerced into values that Time#- will recognize
+ def -(other)
+ other = other.comparable_time if other.respond_to?(:comparable_time)
+ other.is_a?(DateTime) ? to_f - other.to_f : super
+ end
+ end
+end