summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Lib/test/test_datetime.py9
-rw-r--r--Misc/NEWS3
-rw-r--r--Modules/datetimemodule.c6
3 files changed, 18 insertions, 0 deletions
diff --git a/Lib/test/test_datetime.py b/Lib/test/test_datetime.py
index 436cfca..f2f3a87 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 3cefca9..c51b690 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 9ae7732..8207ffd 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. */