From: Georg Brandl Date: Tue, 6 Mar 2007 17:46:17 +0000 (+0000) Subject: Patch #1646728: datetime.fromtimestamp fails with negative X-Git-Tag: v2.5.1c1~86 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=02d7cffb8f0454e605401c05574b53321346fa46;p=thirdparty%2FPython%2Fcpython.git Patch #1646728: datetime.fromtimestamp fails with negative fractional times. With unittest. (backport from rev. 54167 by Guido) --- diff --git a/Lib/test/test_datetime.py b/Lib/test/test_datetime.py index 436cfcad7508..f2f3a87478f9 100644 --- a/Lib/test/test_datetime.py +++ b/Lib/test/test_datetime.py @@ -1425,6 +1425,15 @@ class TestDateTime(TestDate): self.assertRaises(ValueError, self.theclass.utcfromtimestamp, insane) + def test_negative_float_fromtimestamp(self): + # The result is tz-dependent; at least test that this doesn't + # fail (like it did before bug 1646728 was fixed). + self.theclass.fromtimestamp(-1.05) + + def test_negative_float_utcfromtimestamp(self): + d = self.theclass.utcfromtimestamp(-1.05) + self.assertEquals(d, self.theclass(1969, 12, 31, 23, 59, 58, 950000)) + def test_utcnow(self): import time diff --git a/Misc/NEWS b/Misc/NEWS index 3cefca9fcf05..c51b690d42c4 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -118,6 +118,9 @@ Core and builtins Extension Modules ----------------- +- Patch #1646728: datetime.fromtimestamp fails with negative + fractional times. With unittest. + - Patch #1494140: Add documentation for the new struct.Struct object. - Patch #1657276: Make NETLINK_DNRTMSG conditional. diff --git a/Modules/datetimemodule.c b/Modules/datetimemodule.c index 9ae77326b663..8207ffd0c9b2 100644 --- a/Modules/datetimemodule.c +++ b/Modules/datetimemodule.c @@ -3686,6 +3686,12 @@ datetime_from_timestamp(PyObject *cls, TM_FUNC f, double timestamp, return NULL; fraction = timestamp - (double)timet; us = (int)round_to_long(fraction * 1e6); + if (us < 0) { + /* Truncation towards zero is not what we wanted + for negative numbers (Python's mod semantics) */ + timet -= 1; + us += 1000000; + } /* If timestamp is less than one microsecond smaller than a * full second, round up. Otherwise, ValueErrors are raised * for some floats. */