Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit edc6885

Browse files
committed
Closes issue #23600: Wrong results from tzinfo.fromutc().
1 parent 1138439 commit edc6885

3 files changed

Lines changed: 27 additions & 1 deletion

File tree

Lib/test/datetimetester.py

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -180,6 +180,29 @@ def test_pickling_subclass(self):
180180
self.assertEqual(derived.utcoffset(None), offset)
181181
self.assertEqual(derived.tzname(None), oname)
182182

183+
def test_issue23600(self):
184+
DSTDIFF = DSTOFFSET = timedelta(hours=1)
185+
186+
class UKSummerTime(tzinfo):
187+
"""Simple time zone which pretends to always be in summer time, since
188+
that's what shows the failure.
189+
"""
190+
191+
def utcoffset(self, dt):
192+
return DSTOFFSET
193+
194+
def dst(self, dt):
195+
return DSTDIFF
196+
197+
def tzname(self, dt):
198+
return 'UKSummerTime'
199+
200+
tz = UKSummerTime()
201+
u = datetime(2014, 4, 26, 12, 1, tzinfo=tz)
202+
t = tz.fromutc(u)
203+
self.assertEqual(t - t.utcoffset(), u)
204+
205+
183206
class TestTimeZone(unittest.TestCase):
184207

185208
def setUp(self):

Misc/NEWS

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,9 @@ Core and Builtins
8181
Library
8282
-------
8383

84+
- Issue #23600: Default implementation of tzinfo.fromutc() was returning
85+
wrong results in some cases.
86+
8487
- Issue #25203: Failed readline.set_completer_delims() no longer left the
8588
module in inconsistent state.
8689

Modules/_datetimemodule.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3040,7 +3040,7 @@ tzinfo_fromutc(PyDateTime_TZInfo *self, PyObject *dt)
30403040
goto Fail;
30413041
if (dst == Py_None)
30423042
goto Inconsistent;
3043-
if (delta_bool(delta) != 0) {
3043+
if (delta_bool((PyDateTime_Delta *)dst) != 0) {
30443044
PyObject *temp = result;
30453045
result = add_datetime_timedelta((PyDateTime_DateTime *)result,
30463046
(PyDateTime_Delta *)dst, 1);

0 commit comments

Comments
 (0)