Index: Modules/datetimemodule.c =================================================================== --- Modules/datetimemodule.c (Revision 45742) +++ Modules/datetimemodule.c (Arbeitskopie) @@ -3683,6 +3683,13 @@ return NULL; fraction = timestamp - (double)timet; us = (int)round_to_long(fraction * 1e6); + /* If timestamp is less than one microsecond smaller than a + * full second, round up. Otherwise, ValueErrors are raised + * for some floats. */ + if (us == 1000000) { + timet += 1.0; + us = 0; + } return datetime_from_timet_and_us(cls, f, timet, us, tzinfo); } Index: Lib/test/test_datetime.py =================================================================== --- Lib/test/test_datetime.py (Revision 45742) +++ Lib/test/test_datetime.py (Arbeitskopie) @@ -1400,6 +1400,12 @@ got = self.theclass.utcfromtimestamp(ts) self.verify_field_equality(expected, got) + def test_microsecond_rounding(self): + # Test whether fromtimestamp "rounds up" floats that are less + # than one microsecond smaller than an integer. + self.assertEquals(self.theclass.fromtimestamp(0.9999999), + self.theclass.fromtimestamp(1)) + def test_insane_fromtimestamp(self): # It's possible that some platform maps time_t to double, # and that this test will fail there. This test should

AltStyle によって変換されたページ (->オリジナル) /