In tzfile, round offsets to full minutes if needed, since Python's
datetime doesn't accept sub-minute timezones. This prevents the
problem reported by Ilpo Nyyssönen at http://python.org/sf/1447945.
diff --git a/dateutil/tz.py b/dateutil/tz.py
index a1d6c97..e4d2c5c 100644
--- a/dateutil/tz.py
+++ b/dateutil/tz.py
@@ -329,11 +329,16 @@
# Build ttinfo list
self._ttinfo_list = []
for i in range(typecnt):
+ gmtoff, isdst, abbrind = ttinfo[i]
+ # Round to full-minutes if that's not the case. Python's
+ # datetime doesn't accept sub-minute timezones. Check
+ # http://python.org/sf/1447945 for some information.
+ gmtoff = (gmtoff+30)//60*60
tti = _ttinfo()
- tti.offset = ttinfo[i][0]
- tti.delta = datetime.timedelta(seconds=ttinfo[i][0])
- tti.isdst = ttinfo[i][1]
- tti.abbr = abbr[ttinfo[i][2]:abbr.find('\x00', ttinfo[i][2])]
+ tti.offset = gmtoff
+ tti.delta = datetime.timedelta(seconds=gmtoff)
+ tti.isdst = isdst
+ tti.abbr = abbr[abbrind:abbr.find('\x00', abbrind)]
tti.isstd = (ttisstdcnt > i and isstd[i] != 0)
tti.isgmt = (ttisgmtcnt > i and isgmt[i] != 0)
self._ttinfo_list.append(tti)
diff --git a/test.py b/test.py
index 9ff1088..734979c 100644
--- a/test.py
+++ b/test.py
@@ -3640,6 +3640,21 @@
AEVQVAAAAAABAAAAAQ==
"""
+ EUROPE_HELSINKI = """
+VFppZgAAAAAAAAAAAAAAAAAAAAAAAAAFAAAABQAAAAAAAAB1AAAABQAAAA2kc28Yy85RYMy/hdAV
+I+uQFhPckBcDzZAX876QGOOvkBnToJAaw5GQG7y9EBysrhAdnJ8QHoyQEB98gRAgbHIQIVxjECJM
+VBAjPEUQJCw2ECUcJxAmDBgQJwVDkCf1NJAo5SWQKdUWkCrFB5ArtPiQLKTpkC2U2pAuhMuQL3S8
+kDBkrZAxXdkQMnK0EDM9uxA0UpYQNR2dEDYyeBA2/X8QOBuUkDjdYRA5+3aQOr1DEDvbWJA8pl+Q
+Pbs6kD6GQZA/mxyQQGYjkEGEORBCRgWQQ2QbEEQl55BFQ/0QRgXJkEcj3xBH7uYQSQPBEEnOyBBK
+46MQS66qEEzMv5BNjowQTqyhkE9ubhBQjIOQUVeKkFJsZZBTN2yQVExHkFUXTpBWLCmQVvcwkFgV
+RhBY1xKQWfUoEFq29JBb1QoQXKAREF207BBef/MQX5TOEGBf1RBhfeqQYj+3EGNdzJBkH5kQZT2u
+kGYItZBnHZCQZ+iXkGj9cpBpyHmQat1UkGuoW5BsxnEQbYg9kG6mUxBvaB+QcIY1EHFRPBByZhcQ
+czEeEHRF+RB1EQAQdi8VkHbw4hB4DveQeNDEEHnu2ZB6sKYQe867kHyZwpB9rp2QfnmkkH+Of5AC
+AQIDBAMEAwQDBAMEAwQDBAMEAwQDBAMEAwQDBAMEAwQDBAMEAwQDBAMEAwQDBAMEAwQDBAMEAwQD
+BAMEAwQDBAMEAwQDBAMEAwQDBAMEAwQDBAMEAwQDBAMEAwQDBAMEAwQDBAMEAwQDBAMEAwQDBAME
+AwQAABdoAAAAACowAQQAABwgAAkAACowAQQAABwgAAlITVQARUVTVABFRVQAAAAAAQEAAAABAQ==
+ """
+
TZICAL_EST5EDT = """
BEGIN:VTIMEZONE
TZID:US-Eastern
@@ -3796,6 +3811,12 @@
self.assertEqual(datetime(2003,10,26,0,59,tzinfo=tz).tzname(), "EDT")
self.assertEqual(datetime(2003,10,26,1,00,tzinfo=tz).tzname(), "EST")
+ def testRoundNonFullMinutes(self):
+ # This timezone has an offset of 5992 seconds in 1900-01-01.
+ tz = tzfile(StringIO(base64.decodestring(self.EUROPE_HELSINKI)))
+ self.assertEquals(str(datetime(1900,1,1,0,0, tzinfo=tz)),
+ "1900-01-01 00:00:00+01:40")
+
if __name__ == "__main__":
unittest.main()