aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--activesupport/CHANGELOG2
-rw-r--r--activesupport/lib/active_support/core_ext/time/calculations.rb13
-rw-r--r--activesupport/test/core_ext/time_ext_test.rb55
3 files changed, 63 insertions, 7 deletions
diff --git a/activesupport/CHANGELOG b/activesupport/CHANGELOG
index 2c5042c9ef..cfdefed91e 100644
--- a/activesupport/CHANGELOG
+++ b/activesupport/CHANGELOG
@@ -1,5 +1,7 @@
*SVN*
+* Time#since behaves correctly when passed a Duration. Closes #11527 [kemiller]
+
* Add #getutc alias for DateTime#utc [Geoff Buesing]
* Refactor TimeWithZone: don't send #since, #ago, #+, #-, #advance through method_missing [Geoff Buesing]
diff --git a/activesupport/lib/active_support/core_ext/time/calculations.rb b/activesupport/lib/active_support/core_ext/time/calculations.rb
index 0bc83af709..ffbdf37789 100644
--- a/activesupport/lib/active_support/core_ext/time/calculations.rb
+++ b/activesupport/lib/active_support/core_ext/time/calculations.rb
@@ -88,18 +88,21 @@ module ActiveSupport #:nodoc:
end
# Returns a new Time representing the time a number of seconds ago, this is basically a wrapper around the Numeric extension
- # Do not use this method in combination with x.months, use months_ago instead!
def ago(seconds)
self.since(-seconds)
end
# Returns a new Time representing the time a number of seconds since the instance time, this is basically a wrapper around
- # the Numeric extension. Do not use this method in combination with x.months, use months_since instead!
+ # the Numeric extension.
def since(seconds)
- initial_dst = self.dst? ? 1 : 0
f = seconds.since(self)
- final_dst = f.dst? ? 1 : 0
- (seconds.abs >= 86400 && initial_dst != final_dst) ? f + (initial_dst - final_dst).hours : f
+ if ActiveSupport::Duration === seconds
+ f
+ else
+ initial_dst = self.dst? ? 1 : 0
+ final_dst = f.dst? ? 1 : 0
+ (seconds.abs >= 86400 && initial_dst != final_dst) ? f + (initial_dst - final_dst).hours : f
+ end
rescue
self.to_datetime.since(seconds)
end
diff --git a/activesupport/test/core_ext/time_ext_test.rb b/activesupport/test/core_ext/time_ext_test.rb
index d1d92964c3..e53b7193ea 100644
--- a/activesupport/test/core_ext/time_ext_test.rb
+++ b/activesupport/test/core_ext/time_ext_test.rb
@@ -205,6 +205,31 @@ class TimeExtCalculationsTest < Test::Unit::TestCase
end
end
+ def test_daylight_savings_time_crossings_backward_start_1day
+ with_env_tz 'US/Eastern' do
+ # dt: US: 2005 April 3rd 4:18am
+ assert_equal Time.local(2005,4,2,4,18,0), Time.local(2005,4,3,4,18,0).ago(1.day), 'dt-1.day=>st'
+ assert_equal Time.local(2005,4,1,4,18,0), Time.local(2005,4,2,4,18,0).ago(1.day), 'st-1.day=>st'
+ end
+ with_env_tz 'NZ' do
+ # dt: New Zealand: 2006 October 1st 4:18am
+ assert_equal Time.local(2006,9,30,4,18,0), Time.local(2006,10,1,4,18,0).ago(1.day), 'dt-1.day=>st'
+ assert_equal Time.local(2006,9,29,4,18,0), Time.local(2006,9,30,4,18,0).ago(1.day), 'st-1.day=>st'
+ end
+ end
+
+ def test_daylight_savings_time_crossings_backward_end_1day
+ with_env_tz 'US/Eastern' do
+ # st: US: 2005 October 30th 4:03am
+ assert_equal Time.local(2005,10,29,4,3), Time.local(2005,10,30,4,3,0).ago(1.day), 'st-1.day=>dt'
+ assert_equal Time.local(2005,10,28,4,3), Time.local(2005,10,29,4,3,0).ago(1.day), 'dt-1.day=>dt'
+ end
+ with_env_tz 'NZ' do
+ # st: New Zealand: 2006 March 19th 4:03am
+ assert_equal Time.local(2006,3,18,4,3), Time.local(2006,3,19,4,3,0).ago(1.day), 'st-1.day=>dt'
+ assert_equal Time.local(2006,3,17,4,3), Time.local(2006,3,18,4,3,0).ago(1.day), 'dt-1.day=>dt'
+ end
+ end
def test_since
assert_equal Time.local(2005,2,22,10,10,11), Time.local(2005,2,22,10,10,10).since(1)
assert_equal Time.local(2005,2,22,11,10,10), Time.local(2005,2,22,10,10,10).since(3600)
@@ -227,6 +252,19 @@ class TimeExtCalculationsTest < Test::Unit::TestCase
end
end
+ def test_daylight_savings_time_crossings_forward_start_1day
+ with_env_tz 'US/Eastern' do
+ # st: US: 2005 April 2nd 7:27pm
+ assert_equal Time.local(2005,4,3,19,27,0), Time.local(2005,4,2,19,27,0).since(1.day), 'st+1.day=>dt'
+ assert_equal Time.local(2005,4,4,19,27,0), Time.local(2005,4,3,19,27,0).since(1.day), 'dt+1.day=>dt'
+ end
+ with_env_tz 'NZ' do
+ # st: New Zealand: 2006 September 30th 7:27pm
+ assert_equal Time.local(2006,10,1,19,27,0), Time.local(2006,9,30,19,27,0).since(1.day), 'st+1.day=>dt'
+ assert_equal Time.local(2006,10,2,19,27,0), Time.local(2006,10,1,19,27,0).since(1.day), 'dt+1.day=>dt'
+ end
+ end
+
def test_daylight_savings_time_crossings_forward_start_tomorrow
with_env_tz 'US/Eastern' do
# st: US: 2005 April 2nd 7:27pm
@@ -240,7 +278,7 @@ class TimeExtCalculationsTest < Test::Unit::TestCase
end
end
- def test_daylight_savings_time_crossings_forward_start_yesterday
+ def test_daylight_savings_time_crossings_backward_start_yesterday
with_env_tz 'US/Eastern' do
# st: US: 2005 April 2nd 7:27pm
assert_equal Time.local(2005,4,2,19,27,0), Time.local(2005,4,3,19,27,0).yesterday, 'dt-1.day=>st'
@@ -266,6 +304,19 @@ class TimeExtCalculationsTest < Test::Unit::TestCase
end
end
+ def test_daylight_savings_time_crossings_forward_end_1day
+ with_env_tz 'US/Eastern' do
+ # dt: US: 2005 October 30th 12:45am
+ assert_equal Time.local(2005,10,31,0,45,0), Time.local(2005,10,30,0,45,0).since(1.day), 'dt+1.day=>st'
+ assert_equal Time.local(2005,11, 1,0,45,0), Time.local(2005,10,31,0,45,0).since(1.day), 'st+1.day=>st'
+ end
+ with_env_tz 'NZ' do
+ # dt: New Zealand: 2006 March 19th 1:45am
+ assert_equal Time.local(2006,3,20,1,45,0), Time.local(2006,3,19,1,45,0).since(1.day), 'dt+1.day=>st'
+ assert_equal Time.local(2006,3,21,1,45,0), Time.local(2006,3,20,1,45,0).since(1.day), 'st+1.day=>st'
+ end
+ end
+
def test_daylight_savings_time_crossings_forward_end_tomorrow
with_env_tz 'US/Eastern' do
# dt: US: 2005 October 30th 12:45am
@@ -279,7 +330,7 @@ class TimeExtCalculationsTest < Test::Unit::TestCase
end
end
- def test_daylight_savings_time_crossings_forward_end_yesterday
+ def test_daylight_savings_time_crossings_backward_end_yesterday
with_env_tz 'US/Eastern' do
# dt: US: 2005 October 30th 12:45am
assert_equal Time.local(2005,10,30,0,45,0), Time.local(2005,10,31,0,45,0).yesterday, 'st-1.day=>dt'