Patch #1646728: datetime.fromtimestamp fails with negative

fractional times.  With unittest.
  (backport from rev. 54167 by Guido)
This commit is contained in:
Georg Brandl 2007-03-06 17:46:17 +00:00
parent 1a74b4325c
commit 02d7cffb8f
3 changed files with 18 additions and 0 deletions

View File

@ -1425,6 +1425,15 @@ class TestDateTime(TestDate):
self.assertRaises(ValueError, self.theclass.utcfromtimestamp, self.assertRaises(ValueError, self.theclass.utcfromtimestamp,
insane) 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): def test_utcnow(self):
import time import time

View File

@ -118,6 +118,9 @@ Core and builtins
Extension Modules Extension Modules
----------------- -----------------
- Patch #1646728: datetime.fromtimestamp fails with negative
fractional times. With unittest.
- Patch #1494140: Add documentation for the new struct.Struct object. - Patch #1494140: Add documentation for the new struct.Struct object.
- Patch #1657276: Make NETLINK_DNRTMSG conditional. - Patch #1657276: Make NETLINK_DNRTMSG conditional.

View File

@ -3686,6 +3686,12 @@ datetime_from_timestamp(PyObject *cls, TM_FUNC f, double timestamp,
return NULL; return NULL;
fraction = timestamp - (double)timet; fraction = timestamp - (double)timet;
us = (int)round_to_long(fraction * 1e6); 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 /* If timestamp is less than one microsecond smaller than a
* full second, round up. Otherwise, ValueErrors are raised * full second, round up. Otherwise, ValueErrors are raised
* for some floats. */ * for some floats. */