From fbc645fdc4338c891039d506a811fcfefa98713b Mon Sep 17 00:00:00 2001 From: Prem Sichanugrist Date: Tue, 19 Jan 2010 01:55:48 +0700 Subject: [PATCH] Fix bug that causes TimeZone.seconds_to_utc_offset to returns wrong offset when hour < 0 and not in hundreds [#3741] --- .../lib/active_support/values/time_zone.rb | 7 ++++--- activesupport/test/time_zone_test.rb | 6 ++++++ 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/activesupport/lib/active_support/values/time_zone.rb b/activesupport/lib/active_support/values/time_zone.rb index cbb8e89..245d3ce 100644 --- a/activesupport/lib/active_support/values/time_zone.rb +++ b/activesupport/lib/active_support/values/time_zone.rb @@ -172,7 +172,7 @@ module ActiveSupport MAPPING.freeze end - UTC_OFFSET_WITH_COLON = '%+03d:%02d' + UTC_OFFSET_WITH_COLON = '%s%02d:%02d' UTC_OFFSET_WITHOUT_COLON = UTC_OFFSET_WITH_COLON.sub(':', '') # Assumes self represents an offset from UTC in seconds (as returned from Time#utc_offset) @@ -181,9 +181,10 @@ module ActiveSupport # TimeZone.seconds_to_utc_offset(-21_600) # => "-06:00" def self.seconds_to_utc_offset(seconds, colon = true) format = colon ? UTC_OFFSET_WITH_COLON : UTC_OFFSET_WITHOUT_COLON - hours = seconds / 3600 + sign = (seconds < 0 ? '-' : '+') + hours = seconds.abs / 3600 minutes = (seconds.abs % 3600) / 60 - format % [hours, minutes] + format % [sign, hours, minutes] end include Comparable diff --git a/activesupport/test/time_zone_test.rb b/activesupport/test/time_zone_test.rb index 99c4310..ce43c65 100644 --- a/activesupport/test/time_zone_test.rb +++ b/activesupport/test/time_zone_test.rb @@ -208,6 +208,12 @@ class TimeZoneTest < Test::Unit::TestCase assert_equal "+0000", ActiveSupport::TimeZone.seconds_to_utc_offset(0, false) assert_equal "+0500", ActiveSupport::TimeZone.seconds_to_utc_offset(18_000, false) end + + def test_seconds_to_utc_offset_with_negative_offset + assert_equal "-01:00", ActiveSupport::TimeZone.seconds_to_utc_offset(-3_600) + assert_equal "-00:59", ActiveSupport::TimeZone.seconds_to_utc_offset(-3_599) + assert_equal "-05:30", ActiveSupport::TimeZone.seconds_to_utc_offset(-19_800) + end def test_formatted_offset_positive zone = ActiveSupport::TimeZone['Moscow'] -- 1.6.4.2