diff -r 499e44b9bc66 Lib/datetime.py --- a/Lib/datetime.py Fri Sep 04 10:48:31 2015 +0200 +++ b/Lib/datetime.py Fri Sep 04 10:50:07 2015 +0200 @@ -1362,13 +1362,12 @@ class datetime(date): A timezone info object may be passed in as well. """ - _check_tzinfo_arg(tz) converter = _time.localtime if tz is None else _time.gmtime t, frac = divmod(t, 1.0) - us = int(frac * 1e6) + us = _round_half_up(frac * 1e6) # If timestamp is less than one microsecond smaller than a # full second, us can be rounded up to 1000000. In this case, @@ -1386,9 +1385,9 @@ class datetime(date): @classmethod def utcfromtimestamp(cls, t): - "Construct a UTC datetime from a POSIX timestamp (like time.time())." + """Construct a naive UTC datetime from a POSIX timestamp.""" t, frac = divmod(t, 1.0) - us = int(frac * 1e6) + us = _round_half_up(frac * 1e6) # If timestamp is less than one microsecond smaller than a # full second, us can be rounded up to 1000000. In this case, diff -r 499e44b9bc66 Lib/test/datetimetester.py --- a/Lib/test/datetimetester.py Fri Sep 04 10:48:31 2015 +0200 +++ b/Lib/test/datetimetester.py Fri Sep 04 10:50:07 2015 +0200 @@ -1830,6 +1830,7 @@ class TestDateTime(TestDate): zero = fts(0) self.assertEqual(zero.second, 0) self.assertEqual(zero.microsecond, 0) + one = fts(1e-6) try: minus_one = fts(-1e-6) except OSError: @@ -1840,22 +1841,22 @@ class TestDateTime(TestDate): self.assertEqual(minus_one.microsecond, 999999) t = fts(-1e-8) - self.assertEqual(t, minus_one) + self.assertEqual(t, zero) t = fts(-9e-7) self.assertEqual(t, minus_one) t = fts(-1e-7) - self.assertEqual(t, minus_one) + self.assertEqual(t, zero) t = fts(1e-7) self.assertEqual(t, zero) t = fts(9e-7) - self.assertEqual(t, zero) + self.assertEqual(t, one) t = fts(0.99999949) self.assertEqual(t.second, 0) self.assertEqual(t.microsecond, 999999) t = fts(0.9999999) - self.assertEqual(t.second, 0) - self.assertEqual(t.microsecond, 999999) + self.assertEqual(t.second, 1) + self.assertEqual(t.microsecond, 0) def test_insane_fromtimestamp(self): # It's possible that some platform maps time_t to double, diff -r 499e44b9bc66 Modules/_datetimemodule.c --- a/Modules/_datetimemodule.c Fri Sep 04 10:48:31 2015 +0200 +++ b/Modules/_datetimemodule.c Fri Sep 04 10:50:07 2015 +0200 @@ -4107,7 +4107,8 @@ datetime_from_timestamp(PyObject *cls, T time_t timet; long us; - if (_PyTime_ObjectToTimeval(timestamp, &timet, &us, _PyTime_ROUND_DOWN) == -1) + if (_PyTime_ObjectToTimeval(timestamp, + &timet, &us, _PyTime_ROUND_HALF_UP) == -1) return NULL; return datetime_from_timet_and_us(cls, f, timet, (int)us, tzinfo); }