aboutsummaryrefslogtreecommitdiffstats
path: root/activesupport
diff options
context:
space:
mode:
authorAndrew White <pixeltrix@users.noreply.github.com>2016-10-01 21:30:02 +0100
committerGitHub <noreply@github.com>2016-10-01 21:30:02 +0100
commit9ce2d1b1a43fc4ef3db59849b7412d30583a4074 (patch)
treed70ff8a043c9ed6938c925bc354b4dca8ff31060 /activesupport
parent53ede1aff2025d4391d0e05ba471fdaf3110a99c (diff)
parent607a6c7a9a6fb3d8bd7d08d0307018b626105d83 (diff)
downloadrails-9ce2d1b1a43fc4ef3db59849b7412d30583a4074.tar.gz
rails-9ce2d1b1a43fc4ef3db59849b7412d30583a4074.tar.bz2
rails-9ce2d1b1a43fc4ef3db59849b7412d30583a4074.zip
Merge pull request #26677 from tbalthazar/26644
Fix `ActiveSupport::TimeWithZone#localtime`
Diffstat (limited to 'activesupport')
-rw-r--r--activesupport/CHANGELOG.md22
-rw-r--r--activesupport/lib/active_support/time_with_zone.rb3
-rw-r--r--activesupport/test/core_ext/time_with_zone_test.rb6
3 files changed, 30 insertions, 1 deletions
diff --git a/activesupport/CHANGELOG.md b/activesupport/CHANGELOG.md
index f840783059..499310975e 100644
--- a/activesupport/CHANGELOG.md
+++ b/activesupport/CHANGELOG.md
@@ -1,3 +1,25 @@
+* Fix `ActiveSupport::TimeWithZone#localtime` when called with different
+ `utc_offset` values.
+
+ Previously memoization in `localtime` wasn't taking the `utc_offset`
+ parameter into account when returning a cached value. It now caches the
+ computed value depending on the `utc_offset` parameter, e.g:
+
+ Time.zone = "US/Eastern"
+
+ t = Time.zone.local(2016,5,2,11)
+ # => Mon, 02 May 2016 11:00:00 EDT -04:00
+
+ t.localtime(-7200)
+ # => 2016-05-02 13:00:00 -0200
+
+ t.localtime(-3600)
+ # => 2016-05-02 14:00:00 -0100
+
+ Fixes #26644.
+
+ *Thomas Balthazar*
+
* Fix `ActiveSupport::TimeWithZone#in` across DST boundaries.
Previously calls to `in` were being sent to the non-DST aware
diff --git a/activesupport/lib/active_support/time_with_zone.rb b/activesupport/lib/active_support/time_with_zone.rb
index c35588fbae..bee481e5f5 100644
--- a/activesupport/lib/active_support/time_with_zone.rb
+++ b/activesupport/lib/active_support/time_with_zone.rb
@@ -80,7 +80,8 @@ module ActiveSupport
# Returns a <tt>Time</tt> instance of the simultaneous time in the system timezone.
def localtime(utc_offset = nil)
- @localtime ||= utc.getlocal(utc_offset)
+ @localtime ||= {}
+ @localtime[utc_offset] ||= utc.getlocal(utc_offset)
end
alias_method :getlocal, :localtime
diff --git a/activesupport/test/core_ext/time_with_zone_test.rb b/activesupport/test/core_ext/time_with_zone_test.rb
index e35aa6e154..5c940da1e3 100644
--- a/activesupport/test/core_ext/time_with_zone_test.rb
+++ b/activesupport/test/core_ext/time_with_zone_test.rb
@@ -54,6 +54,12 @@ class TimeWithZoneTest < ActiveSupport::TestCase
assert_instance_of Time, @dt_twz.localtime
end
+ def test_localtime_with_offset
+ assert_equal 0, @twz.localtime.gmt_offset
+ assert_equal (-3600), @twz.localtime(-3600).gmt_offset
+ assert_equal (-7200), @twz.localtime(-7200).gmt_offset
+ end
+
def test_utc?
assert_equal false, @twz.utc?