Skip to content

Commit

Permalink
Move Numeric#to_utc_offset_s to TimeZone.seconds_to_utc_offset
Browse files Browse the repository at this point in the history
  • Loading branch information
jeremy committed Mar 24, 2009
1 parent 0bd668f commit e094940
Show file tree
Hide file tree
Showing 7 changed files with 30 additions and 34 deletions.
Expand Up @@ -56,7 +56,7 @@ def to_formatted_s(format = :default)
# datetime.formatted_offset # => "-06:00" # datetime.formatted_offset # => "-06:00"
# datetime.formatted_offset(false) # => "-0600" # datetime.formatted_offset(false) # => "-0600"
def formatted_offset(colon = true, alternate_utc_string = nil) def formatted_offset(colon = true, alternate_utc_string = nil)
utc? && alternate_utc_string || utc_offset.to_utc_offset_s(colon) utc? && alternate_utc_string || TimeZone.seconds_to_utc_offset(utc_offset, colon)
end end


# Overrides the default inspect method with a human readable one, e.g., "Mon, 21 Feb 2005 14:30:00 +0000" # Overrides the default inspect method with a human readable one, e.g., "Mon, 21 Feb 2005 14:30:00 +0000"
Expand Down
15 changes: 0 additions & 15 deletions activesupport/lib/active_support/core_ext/numeric/conversions.rb

This file was deleted.

Expand Up @@ -54,7 +54,7 @@ def to_formatted_s(format = :default)
# Time.local(2000).formatted_offset # => "-06:00" # Time.local(2000).formatted_offset # => "-06:00"
# Time.local(2000).formatted_offset(false) # => "-0600" # Time.local(2000).formatted_offset(false) # => "-0600"
def formatted_offset(colon = true, alternate_utc_string = nil) def formatted_offset(colon = true, alternate_utc_string = nil)
utc? && alternate_utc_string || utc_offset.to_utc_offset_s(colon) utc? && alternate_utc_string || TimeZone.seconds_to_utc_offset(utc_offset, colon)
end end


# Converts a Time object to a Date, dropping hour, minute, and second precision. # Converts a Time object to a Date, dropping hour, minute, and second precision.
Expand Down
2 changes: 1 addition & 1 deletion activesupport/lib/active_support/time_with_zone.rb
Expand Up @@ -87,7 +87,7 @@ def utc_offset
alias_method :gmtoff, :utc_offset alias_method :gmtoff, :utc_offset


def formatted_offset(colon = true, alternate_utc_string = nil) def formatted_offset(colon = true, alternate_utc_string = nil)
utc? && alternate_utc_string || utc_offset.to_utc_offset_s(colon) utc? && alternate_utc_string || TimeZone.seconds_to_utc_offset(utc_offset, colon)
end end


# Time uses +zone+ to display the time zone abbreviation, so we're duck-typing it. # Time uses +zone+ to display the time zone abbreviation, so we're duck-typing it.
Expand Down
16 changes: 15 additions & 1 deletion activesupport/lib/active_support/values/time_zone.rb
Expand Up @@ -170,6 +170,20 @@ class TimeZone
MAPPING.freeze MAPPING.freeze
end end


UTC_OFFSET_WITH_COLON = '%+03d:%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)
# and turns this into an +HH:MM formatted string. Example:
#
# 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
minutes = (seconds.abs % 3600) / 60
format % [hours, minutes]
end

include Comparable include Comparable
attr_reader :name attr_reader :name


Expand All @@ -190,7 +204,7 @@ def utc_offset
# Returns the offset of this time zone as a formatted string, of the # Returns the offset of this time zone as a formatted string, of the
# format "+HH:MM". # format "+HH:MM".
def formatted_offset(colon=true, alternate_utc_string = nil) def formatted_offset(colon=true, alternate_utc_string = nil)
utc_offset == 0 && alternate_utc_string || utc_offset.to_utc_offset_s(colon) utc_offset == 0 && alternate_utc_string || self.class.seconds_to_utc_offset(utc_offset, colon)
end end


# Compare this time zone to the parameter. The two are comapred first on # Compare this time zone to the parameter. The two are comapred first on
Expand Down
15 changes: 0 additions & 15 deletions activesupport/test/core_ext/numeric_ext_test.rb
Expand Up @@ -145,18 +145,3 @@ def test_units_as_bytes_independently
assert_equal 3458764513820540928, 3.exabyte assert_equal 3458764513820540928, 3.exabyte
end end
end end

class NumericExtConversionsTest < Test::Unit::TestCase

def test_to_utc_offset_s_with_colon
assert_equal "-06:00", -21_600.to_utc_offset_s
assert_equal "+00:00", 0.to_utc_offset_s
assert_equal "+05:00", 18_000.to_utc_offset_s
end

def test_to_utc_offset_s_without_colon
assert_equal "-0600", -21_600.to_utc_offset_s(false)
assert_equal "+0000", 0.to_utc_offset_s(false)
assert_equal "+0500", 18_000.to_utc_offset_s(false)
end
end
12 changes: 12 additions & 0 deletions activesupport/test/time_zone_test.rb
Expand Up @@ -196,6 +196,18 @@ def test_utc_offset_lazy_loaded_from_tzinfo_when_not_passed_in_to_initialize
assert_equal(-18_000, zone.utc_offset) assert_equal(-18_000, zone.utc_offset)
end end


def test_seconds_to_utc_offset_with_colon
assert_equal "-06:00", TimeZone.seconds_to_utc_offset(-21_600)
assert_equal "+00:00", TimeZone.seconds_to_utc_offset(0)
assert_equal "+05:00", TimeZone.seconds_to_utc_offset(18_000)
end

def test_seconds_to_utc_offset_without_colon
assert_equal "-0600", TimeZone.seconds_to_utc_offset(-21_600)
assert_equal "+0000", TimeZone.seconds_to_utc_offset(0)
assert_equal "+0500", TimeZone.seconds_to_utc_offset(18_000)
end

def test_formatted_offset_positive def test_formatted_offset_positive
zone = ActiveSupport::TimeZone['Moscow'] zone = ActiveSupport::TimeZone['Moscow']
assert_equal "+03:00", zone.formatted_offset assert_equal "+03:00", zone.formatted_offset
Expand Down

0 comments on commit e094940

Please sign in to comment.