mirror of
https://github.com/python/cpython.git
synced 2025-08-03 16:39:00 +00:00
Issue #1667546: On platforms supporting tm_zone and tm_gmtoff fields
in struct tm, time.struct_time objects returned by time.gmtime(), time.localtime() and time.strptime() functions now have tm_zone and tm_gmtoff attributes. Original patch by Paul Boddie.
This commit is contained in:
parent
f6a899fe6d
commit
c142bba2a7
6 changed files with 117 additions and 9 deletions
|
@ -78,8 +78,9 @@ class StructSeqTest(unittest.TestCase):
|
|||
|
||||
def test_fields(self):
|
||||
t = time.gmtime()
|
||||
self.assertEqual(len(t), t.n_fields)
|
||||
self.assertEqual(t.n_fields, t.n_sequence_fields+t.n_unnamed_fields)
|
||||
self.assertEqual(len(t), t.n_sequence_fields)
|
||||
self.assertEqual(t.n_unnamed_fields, 0)
|
||||
self.assertEqual(t.n_fields, time._STRUCT_TM_ITEMS)
|
||||
|
||||
def test_constructor(self):
|
||||
t = time.struct_time
|
||||
|
|
|
@ -620,7 +620,58 @@ class TestPytime(unittest.TestCase):
|
|||
for invalid in self.invalid_values:
|
||||
self.assertRaises(OverflowError, pytime_object_to_timespec, invalid)
|
||||
|
||||
@unittest.skipUnless(time._STRUCT_TM_ITEMS == 11, "needs tm_zone support")
|
||||
def test_localtime_timezone(self):
|
||||
|
||||
# Get the localtime and examine it for the offset and zone.
|
||||
lt = time.localtime()
|
||||
self.assertTrue(hasattr(lt, "tm_gmtoff"))
|
||||
self.assertTrue(hasattr(lt, "tm_zone"))
|
||||
|
||||
# See if the offset and zone are similar to the module
|
||||
# attributes.
|
||||
if lt.tm_gmtoff is None:
|
||||
self.assertTrue(not hasattr(time, "timezone"))
|
||||
else:
|
||||
self.assertEqual(lt.tm_gmtoff, -[time.timezone, time.altzone][lt.tm_isdst])
|
||||
if lt.tm_zone is None:
|
||||
self.assertTrue(not hasattr(time, "tzname"))
|
||||
else:
|
||||
self.assertEqual(lt.tm_zone, time.tzname[lt.tm_isdst])
|
||||
|
||||
# Try and make UNIX times from the localtime and a 9-tuple
|
||||
# created from the localtime. Test to see that the times are
|
||||
# the same.
|
||||
t = time.mktime(lt); t9 = time.mktime(lt[:9])
|
||||
self.assertEqual(t, t9)
|
||||
|
||||
# Make localtimes from the UNIX times and compare them to
|
||||
# the original localtime, thus making a round trip.
|
||||
new_lt = time.localtime(t); new_lt9 = time.localtime(t9)
|
||||
self.assertEqual(new_lt, lt)
|
||||
self.assertEqual(new_lt.tm_gmtoff, lt.tm_gmtoff)
|
||||
self.assertEqual(new_lt.tm_zone, lt.tm_zone)
|
||||
self.assertEqual(new_lt9, lt)
|
||||
self.assertEqual(new_lt.tm_gmtoff, lt.tm_gmtoff)
|
||||
self.assertEqual(new_lt9.tm_zone, lt.tm_zone)
|
||||
|
||||
@unittest.skipUnless(time._STRUCT_TM_ITEMS == 11, "needs tm_zone support")
|
||||
def test_strptime_timezone(self):
|
||||
t = time.strptime("UTC", "%Z")
|
||||
self.assertEqual(t.tm_zone, 'UTC')
|
||||
t = time.strptime("+0500", "%z")
|
||||
self.assertEqual(t.tm_gmtoff, 5 * 3600)
|
||||
|
||||
@unittest.skipUnless(time._STRUCT_TM_ITEMS == 11, "needs tm_zone support")
|
||||
def test_short_times(self):
|
||||
|
||||
import pickle
|
||||
|
||||
# Load a short time structure using pickle.
|
||||
st = b"ctime\nstruct_time\np0\n((I2007\nI8\nI11\nI1\nI24\nI49\nI5\nI223\nI1\ntp1\n(dp2\ntp3\nRp4\n."
|
||||
lt = pickle.loads(st)
|
||||
self.assertIs(lt.tm_gmtoff, None)
|
||||
self.assertIs(lt.tm_zone, None)
|
||||
|
||||
def test_main():
|
||||
support.run_unittest(
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue