Commit 172d9ef4 authored by Brett Cannon's avatar Brett Cannon

Beefed up timezone support. UTC and GMT are now always recognized timezones

with values of 0.  Also now check time.daylight to see if time.tzname[1]
should be used in timezone checking.
parent c2409b4f
...@@ -283,9 +283,13 @@ class LocaleTime(object): ...@@ -283,9 +283,13 @@ class LocaleTime(object):
def __calc_timezone(self): def __calc_timezone(self):
# Set self.__timezone by using time.tzname. # Set self.__timezone by using time.tzname.
# #
# Empty string used for matching when timezone is not used/needed such # Empty string used for matching when timezone is not used/needed.
# as with UTC. time_zones = ["UTC", "GMT"]
self.__timezone = self.__pad(time.tzname, 0) if time.daylight:
time_zones.extend(time.tzname)
else:
time_zones.append(time.tzname[0])
self.__timezone = self.__pad(time_zones, 0)
def __calc_lang(self): def __calc_lang(self):
# Set self.__lang by using __getlang(). # Set self.__lang by using __getlang().
...@@ -490,16 +494,20 @@ def strptime(data_string, format="%a %b %d %H:%M:%S %Y"): ...@@ -490,16 +494,20 @@ def strptime(data_string, format="%a %b %d %H:%M:%S %Y"):
elif group_key == 'j': elif group_key == 'j':
julian = int(found_dict['j']) julian = int(found_dict['j'])
elif group_key == 'Z': elif group_key == 'Z':
# Since -1 is default value only need to worry about setting tz if
# it can be something other than -1.
found_zone = found_dict['Z'].lower() found_zone = found_dict['Z'].lower()
if locale_time.timezone[0] == locale_time.timezone[1]: if locale_time.timezone[0] == locale_time.timezone[1]:
pass #Deals with bad locale setup where timezone info is pass #Deals with bad locale setup where timezone info is
# the same; first found on FreeBSD 4.4. # the same; first found on FreeBSD 4.4.
elif locale_time.timezone[0].lower() == found_zone: elif found_zone in ("utc", "gmt"):
tz = 0 tz = 0
elif locale_time.timezone[1].lower() == found_zone:
tz = 1
elif locale_time.timezone[2].lower() == found_zone: elif locale_time.timezone[2].lower() == found_zone:
tz = -1 tz = 0
elif time.daylight:
if locale_time.timezone[3].lower() == found_zone:
tz = 1
# Cannot pre-calculate datetime_date() since can change in Julian # Cannot pre-calculate datetime_date() since can change in Julian
#calculation and thus could have different value for the day of the week #calculation and thus could have different value for the day of the week
#calculation #calculation
......
...@@ -58,9 +58,11 @@ class LocaleTime_Tests(unittest.TestCase): ...@@ -58,9 +58,11 @@ class LocaleTime_Tests(unittest.TestCase):
def test_timezone(self): def test_timezone(self):
# Make sure timezone is correct # Make sure timezone is correct
if time.strftime("%Z", self.time_tuple): timezone = time.strftime("%Z", self.time_tuple)
self.compare_against_time(self.LT_ins.timezone, '%Z', 8, if timezone:
"Testing against timezone failed") self.failUnless(timezone in self.LT_ins.timezone,
"timezone %s not found in %s" %
(timezone, self.LT_ins.timezone))
def test_date_time(self): def test_date_time(self):
# Check that LC_date_time, LC_date, and LC_time are correct # Check that LC_date_time, LC_date, and LC_time are correct
...@@ -293,18 +295,25 @@ class StrptimeTests(unittest.TestCase): ...@@ -293,18 +295,25 @@ class StrptimeTests(unittest.TestCase):
# When gmtime() is used with %Z, entire result of strftime() is empty. # When gmtime() is used with %Z, entire result of strftime() is empty.
# Check for equal timezone names deals with bad locale info when this # Check for equal timezone names deals with bad locale info when this
# occurs; first found in FreeBSD 4.4. # occurs; first found in FreeBSD 4.4.
strp_output = _strptime.strptime("UTC", "%Z")
self.failUnlessEqual(strp_output.tm_isdst, 0)
strp_output = _strptime.strptime("GMT", "%Z")
self.failUnlessEqual(strp_output.tm_isdst, 0)
if time.daylight:
strp_output = _strptime.strptime(time.tzname[1], "%Z")
self.failUnlessEqual(strp_output[8], 1)
time_tuple = time.localtime() time_tuple = time.localtime()
strf_output = time.strftime("%Z") #UTC does not have a timezone strf_output = time.strftime("%Z") #UTC does not have a timezone
strp_output = _strptime.strptime(strf_output, "%Z") strp_output = _strptime.strptime(strf_output, "%Z")
locale_time = _strptime.LocaleTime() locale_time = _strptime.LocaleTime()
if locale_time.timezone[0] != locale_time.timezone[1]: if time.tzname[0] != time.tzname[1]:
self.failUnless(strp_output[8] == time_tuple[8], self.failUnless(strp_output[8] == time_tuple[8],
"timezone check failed; '%s' -> %s != %s" % "timezone check failed; '%s' -> %s != %s" %
(strf_output, strp_output[8], time_tuple[8])) (strf_output, strp_output[8], time_tuple[8]))
else: else:
self.failUnless(strp_output[8] == -1, self.failUnless(strp_output[8] == -1,
"LocaleTime().timezone has duplicate values but " "LocaleTime().timezone has duplicate values but "
"timzone value not set to 0") "timzone value not set to -1")
def test_date_time(self): def test_date_time(self):
# Test %c directive # Test %c directive
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment