[Python-checkins] cpython: Issue #9527: tm_gmtoff has 'correct' sign.
alexander.belopolsky
python-checkins at python.org
Fri Jun 22 22:09:57 CEST 2012
http://hg.python.org/cpython/rev/0f0e3ec22fce
changeset: 77582:0f0e3ec22fce
parent: 77580:34319fc28da6
user: Alexander Belopolsky <alexander.belopolsky at gmail.com>
date: Fri Jun 22 16:04:19 2012 -0400
summary:
Issue #9527: tm_gmtoff has 'correct' sign.
files:
Doc/library/time.rst | 2 +-
Lib/datetime.py | 6 +++---
Lib/test/datetimetester.py | 6 ++++--
Modules/_datetimemodule.c | 10 +++-------
4 files changed, 11 insertions(+), 13 deletions(-)
diff --git a/Doc/library/time.rst b/Doc/library/time.rst
--- a/Doc/library/time.rst
+++ b/Doc/library/time.rst
@@ -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 --git a/Lib/datetime.py b/Lib/datetime.py
--- a/Lib/datetime.py
+++ b/Lib/datetime.py
@@ -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 --git a/Lib/test/datetimetester.py b/Lib/test/datetimetester.py
--- a/Lib/test/datetimetester.py
+++ b/Lib/test/datetimetester.py
@@ -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 --git a/Modules/_datetimemodule.c b/Modules/_datetimemodule.c
--- a/Modules/_datetimemodule.c
+++ b/Modules/_datetimemodule.c
@@ -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)
--
Repository URL: http://hg.python.org/cpython
More information about the Python-checkins
mailing list