diff -r 63e2a52ef34e Lib/email/utils.py --- a/Lib/email/utils.py Sun Mar 11 23:39:28 2012 -0400 +++ b/Lib/email/utils.py Tue Mar 13 00:02:04 2012 +0000 @@ -405,12 +405,12 @@ # offset has changed since time provided in dt. This will be # corrected in C implementation for platforms that support # tm_gmtoff. - if time.daylight: - if tm.tm_isdst: - offset = time.altzone - tzname = time.tzname[1] - else: - offset = time.timezone - tzname = time.tzname[0] + if time.daylight and tm.tm_isdst: + offset = time.altzone + tzname = time.tzname[1] + else: + offset = time.timezone + tzname = time.tzname[0] + tz = datetime.timezone(datetime.timedelta(seconds=-offset), tzname) return datetime.datetime.fromtimestamp(seconds, tz) diff -r 63e2a52ef34e Lib/test/test_email/test_utils.py --- a/Lib/test/test_email/test_utils.py Sun Mar 11 23:39:28 2012 -0400 +++ b/Lib/test/test_email/test_utils.py Tue Mar 13 00:02:04 2012 +0000 @@ -1,5 +1,7 @@ import datetime from email import utils +import test.support +import time import unittest class DateTimeTests(unittest.TestCase): @@ -46,25 +48,70 @@ class LocaltimeTests(unittest.TestCase): - def test_localtime(self): - # Based on Issue 9527 patch + def test_localtime_is_tz_aware_daylight_true(self): + test.support.patch(self, time, 'daylight', True) t = utils.localtime() self.assertIsNot(t.tzinfo, None) - t0 = datetime.datetime(1970, 1, 1, tzinfo = datetime.timezone.utc) - t1 = utils.localtime(t0) - self.assertEqual(t0, t1) - t2 = utils.localtime(t1.replace(tzinfo=None)) - self.assertEqual(t1, t2) - # The following tests use local time that is ambiguous in the - # US, but should work in any location - t0 = datetime.datetime(2010, 11, 7, 1, 30) - t1 = utils.localtime(t0, isdst=0) + + def test_localtime_is_tz_aware_daylight_false(self): + test.support.patch(self, time, 'daylight', False) + t = utils.localtime() + self.assertIsNot(t.tzinfo, None) + + def test_localtime_daylight_true_dst_false(self): + test.support.patch(self, time, 'daylight', True) + t0 = datetime.datetime(2012, 3, 12, 1, 1) + t1 = utils.localtime(t0, isdst=-1) t2 = utils.localtime(t1) self.assertEqual(t1, t2) + + def test_localtime_daylight_false_dst_false(self): + test.support.patch(self, time, 'daylight', False) + t0 = datetime.datetime(2012, 3, 12, 1, 1) + t1 = utils.localtime(t0, isdst=-1) + t2 = utils.localtime(t1) + self.assertEqual(t1, t2) + + def test_localtime_daylight_true_dst_true(self): + test.support.patch(self, time, 'daylight', True) + t0 = datetime.datetime(2012, 3, 12, 1, 1) t1 = utils.localtime(t0, isdst=1) t2 = utils.localtime(t1) self.assertEqual(t1, t2) + def test_localtime_daylight_false_dst_true(self): + test.support.patch(self, time, 'daylight', False) + t0 = datetime.datetime(2012, 3, 12, 1, 1) + t1 = utils.localtime(t0, isdst=1) + t2 = utils.localtime(t1) + self.assertEqual(t1, t2) + + def test_localtime_epoch_utc_daylight_true(self): + test.support.patch(self, time, 'daylight', True) + t0 = datetime.datetime(1970, 1, 1, tzinfo = datetime.timezone.utc) + t1 = utils.localtime(t0) + self.assertEqual(t0, t1) + + def test_localtime_epoch_utc_daylight_false(self): + test.support.patch(self, time, 'daylight', False) + t0 = datetime.datetime(1970, 1, 1, tzinfo = datetime.timezone.utc) + t1 = utils.localtime(t0) + self.assertEqual(t0, t1) + + def test_localtime_epoch_notz_daylight_true(self): + test.support.patch(self, time, 'daylight', True) + t0 = datetime.datetime(1970, 1, 1) + t1 = utils.localtime(t0) + t2 = utils.localtime(t0.replace(tzinfo=None)) + self.assertEqual(t1, t2) + + def test_localtime_epoch_notz_daylight_false(self): + test.support.patch(self, time, 'daylight', False) + t0 = datetime.datetime(1970, 1, 1) + t1 = utils.localtime(t0) + t2 = utils.localtime(t0.replace(tzinfo=None)) + self.assertEqual(t1, t2) + if __name__ == '__main__': unittest.main() diff -r 63e2a52ef34e Misc/ACKS --- a/Misc/ACKS Sun Mar 11 23:39:28 2012 -0400 +++ b/Misc/ACKS Tue Mar 13 00:02:04 2012 +0000 @@ -499,6 +499,7 @@ Matt Joiner Thomas Jollans Nicolas Joly +Brian K. Jones Evan Jones Jeremy Jones Richard Jones