changeset: 77582:0f0e3ec22fce parent: 77580:34319fc28da6 user: Alexander Belopolsky date: Fri Jun 22 16:04:19 2012 -0400 files: Doc/library/time.rst Lib/datetime.py Lib/test/datetimetester.py Modules/_datetimemodule.c description: Issue #9527: tm_gmtoff has 'correct' sign. diff -r 34319fc28da6 -r 0f0e3ec22fce Doc/library/time.rst --- a/Doc/library/time.rst Fri Jun 22 21:13:34 2012 +0200 +++ b/Doc/library/time.rst Fri Jun 22 16:04:19 2012 -0400 @@ -545,7 +545,7 @@ +-------+-------------------+---------------------------------+ | N/A | :attr:`tm_zone` | abbreviation of timezone name | +-------+-------------------+---------------------------------+ - | N/A | :attr:`tm_gmtoff` | offset from UTC in seconds | + | N/A | :attr:`tm_gmtoff` | offset east of UTC in seconds | +-------+-------------------+---------------------------------+ Note that unlike the C structure, the month value is a range of [1, 12], not diff -r 34319fc28da6 -r 0f0e3ec22fce Lib/datetime.py --- a/Lib/datetime.py Fri Jun 22 21:13:34 2012 +0200 +++ b/Lib/datetime.py Fri Jun 22 16:04:19 2012 -0400 @@ -1510,13 +1510,13 @@ # implied by tm_isdst. delta = local - datetime(*_time.gmtime(ts)[:6]) dst = _time.daylight and localtm.tm_isdst > 0 - gmtoff = _time.altzone if dst else _time.timezone - if delta == timedelta(seconds=-gmtoff): + gmtoff = -(_time.altzone if dst else _time.timezone) + if delta == timedelta(seconds=gmtoff): tz = timezone(delta, _time.tzname[dst]) else: tz = timezone(delta) else: - tz = timezone(timedelta(seconds=-gmtoff), zone) + tz = timezone(timedelta(seconds=gmtoff), zone) elif not isinstance(tz, tzinfo): raise TypeError("tz argument must be an instance of tzinfo") diff -r 34319fc28da6 -r 0f0e3ec22fce Lib/test/datetimetester.py --- a/Lib/test/datetimetester.py Fri Jun 22 21:13:34 2012 +0200 +++ b/Lib/test/datetimetester.py Fri Jun 22 16:04:19 2012 -0400 @@ -3278,16 +3278,18 @@ self.assertEqual(dt.astimezone(None), dt) self.assertEqual(dt.astimezone(), dt) + # Note that offset in TZ variable has the opposite sign to that + # produced by %z directive. @support.run_with_tz('EST+05EDT,M3.2.0,M11.1.0') def test_astimezone_default_eastern(self): dt = self.theclass(2012, 11, 4, 6, 30, tzinfo=timezone.utc) local = dt.astimezone() self.assertEqual(dt, local) - self.assertEqual(local.strftime("%z %Z"), "+0500 EST") + self.assertEqual(local.strftime("%z %Z"), "-0500 EST") dt = self.theclass(2012, 11, 4, 5, 30, tzinfo=timezone.utc) local = dt.astimezone() self.assertEqual(dt, local) - self.assertEqual(local.strftime("%z %Z"), "+0400 EDT") + self.assertEqual(local.strftime("%z %Z"), "-0400 EDT") def test_aware_subtract(self): cls = self.theclass diff -r 34319fc28da6 -r 0f0e3ec22fce Modules/_datetimemodule.c --- a/Modules/_datetimemodule.c Fri Jun 22 21:13:34 2012 +0200 +++ b/Modules/_datetimemodule.c Fri Jun 22 16:04:19 2012 -0400 @@ -4717,12 +4717,8 @@ return NULL; timep = localtime(×tamp); #ifdef HAVE_STRUCT_TM_TM_ZONE - { - long offset; - offset = timep->tm_gmtoff; - zone = timep->tm_zone; - delta = new_delta(0, -offset, 0, 0); - } + zone = timep->tm_zone; + delta = new_delta(0, timep->tm_gmtoff, 0, 1); #else /* HAVE_STRUCT_TM_TM_ZONE */ { PyObject *local_time; @@ -4732,7 +4728,7 @@ utc_time->tzinfo); if (local_time == NULL) goto error; - delta = datetime_subtract((PyObject*)utc_time, local_time); + delta = datetime_subtract(local_time, (PyObject*)utc_time); /* XXX: before relying on tzname, we should compare delta to the offset implied by timezone/altzone */ if (daylight && timep->tm_isdst >= 0)