]> granicus.if.org Git - python/commitdiff
Issue #9527: tm_gmtoff has 'correct' sign.
authorAlexander Belopolsky <alexander.belopolsky@gmail.com>
Fri, 22 Jun 2012 20:04:19 +0000 (16:04 -0400)
committerAlexander Belopolsky <alexander.belopolsky@gmail.com>
Fri, 22 Jun 2012 20:04:19 +0000 (16:04 -0400)
Doc/library/time.rst
Lib/datetime.py
Lib/test/datetimetester.py
Modules/_datetimemodule.c

index 3faabf736e2a0f4d81c59095bb3365c9f12fdb85..ac3fb5e4cddf28ad098379762eddb00db23e170a 100644 (file)
@@ -545,7 +545,7 @@ The module defines the following functions and data items:
    +-------+-------------------+---------------------------------+
    | 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
index e4d716198ff0f8cfd4ecffbffbedf9513a04e444..a15c6b091901e4c7b5098ac5fea62d2d357305df 100644 (file)
@@ -1510,13 +1510,13 @@ class datetime(date):
                 # 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")
index 4181d4fe588ae84abc5914326522c32103e96bd9..a417170d3f9df2906a67ace68accca8f27a8ecc6 100644 (file)
@@ -3278,16 +3278,18 @@ class TestDateTimeTZ(TestDateTime, TZInfoBase, unittest.TestCase):
         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
index 149f573c69ab99028064ba7b15fb936618d19f67..6df5c03b97337a832c068c5be240ad026c6477f6 100644 (file)
@@ -4717,12 +4717,8 @@ local_timezone(PyDateTime_DateTime *utc_time)
         return NULL;
     timep = localtime(&timestamp);
 #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 @@ local_timezone(PyDateTime_DateTime *utc_time)
                                   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)