aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--activesupport/CHANGELOG2
-rw-r--r--activesupport/lib/active_support/time_with_zone.rb14
-rw-r--r--activesupport/test/core_ext/time_with_zone_test.rb12
3 files changed, 16 insertions, 12 deletions
diff --git a/activesupport/CHANGELOG b/activesupport/CHANGELOG
index e1b4b9a516..c74855f31f 100644
--- a/activesupport/CHANGELOG
+++ b/activesupport/CHANGELOG
@@ -1,5 +1,7 @@
*SVN*
+* TimeWithZone time conversions don't need to be wrapped in TimeOrDateTime, because TZInfo does this internally [Geoff Buesing]
+
* TimeWithZone#usec returns 0 instead of error when DateTime is wrapped [Geoff Buesing]
* Improve documentation. [Radar, Jan De Poorter, chuyeow, xaviershay, danger, miloops, Xavier Noria, Sunny Ripert]
diff --git a/activesupport/lib/active_support/time_with_zone.rb b/activesupport/lib/active_support/time_with_zone.rb
index 3c37ab2d4c..6566c1c385 100644
--- a/activesupport/lib/active_support/time_with_zone.rb
+++ b/activesupport/lib/active_support/time_with_zone.rb
@@ -12,12 +12,12 @@ module ActiveSupport
# Returns a Time or DateTime instance that represents the time in time_zone
def time
- @time ||= utc_to_local
+ @time ||= period.to_local(@utc)
end
# Returns a Time or DateTime instance that represents the time in UTC
def utc
- @utc ||= local_to_utc
+ @utc ||= period.to_utc(@time)
end
alias_method :comparable_time, :utc
alias_method :getgm, :utc
@@ -240,15 +240,5 @@ module ActiveSupport
def transfer_time_values_to_utc_constructor(time)
::Time.utc_time(time.year, time.month, time.day, time.hour, time.min, time.sec, time.respond_to?(:usec) ? time.usec : 0)
end
-
- # Replicating logic from TZInfo::Timezone#utc_to_local because we want to cache the period in an instance variable for reuse
- def utc_to_local
- ::TZInfo::TimeOrDateTime.wrap(utc) {|utc| period.to_local(utc)}
- end
-
- # Replicating logic from TZInfo::Timezone#local_to_utc because we want to cache the period in an instance variable for reuse
- def local_to_utc
- ::TZInfo::TimeOrDateTime.wrap(time) {|time| period.to_utc(time)}
- end
end
end
diff --git a/activesupport/test/core_ext/time_with_zone_test.rb b/activesupport/test/core_ext/time_with_zone_test.rb
index 4fe1be3ed6..5a645dc765 100644
--- a/activesupport/test/core_ext/time_with_zone_test.rb
+++ b/activesupport/test/core_ext/time_with_zone_test.rb
@@ -372,6 +372,18 @@ uses_tzinfo 'TimeWithZoneTest' do
assert_equal ruby_19_or_greater, @twz.respond_to?(name)
end
end
+
+ def test_utc_to_local_conversion_with_far_future_datetime
+ silence_warnings do # silence warnings raised by tzinfo gem
+ assert_equal [0,0,19,31,12,2049], ActiveSupport::TimeWithZone.new(DateTime.civil(2050), @time_zone).to_a[0,6]
+ end
+ end
+
+ def test_local_to_utc_conversion_with_far_future_datetime
+ silence_warnings do # silence warnings raised by tzinfo gem
+ assert_equal DateTime.civil(2050).to_f, ActiveSupport::TimeWithZone.new(nil, @time_zone, DateTime.civil(2049,12,31,19)).to_f
+ end
+ end
end
class TimeWithZoneMethodsForTimeAndDateTimeTest < Test::Unit::TestCase