diff --git a/resync/w3c_datetime.py b/resync/w3c_datetime.py index 7896d88..bd4b68a 100644 --- a/resync/w3c_datetime.py +++ b/resync/w3c_datetime.py @@ -32,6 +32,8 @@ def datetime_to_str(dt='now',no_fractions=False): dt = time.time() if (no_fractions): dt = int(dt) + else: + dt += 0.0000001 # improve rounding to microseconds return datetime.utcfromtimestamp(dt).isoformat() + 'Z' def str_to_datetime(s, context='datetime'): diff --git a/tests/test_w3c_datetime.py b/tests/test_w3c_datetime.py index b8d1350..474970f 100644 --- a/tests/test_w3c_datetime.py +++ b/tests/test_w3c_datetime.py @@ -21,6 +21,16 @@ class TestW3cDatetime(unittest.TestCase): self.assertEqual( datetime_to_str(60*60*24*365), "1971-01-01T00:00:00Z" ) # self.assertEqual( datetime_to_str(1234567890), "2009-02-13T23:31:30Z" ) + # Rounding issues + self.assertEqual( datetime_to_str(0.199999), "1970-01-01T00:00:00.199999Z" ) + self.assertEqual( datetime_to_str(0.1999991), "1970-01-01T00:00:00.199999Z" ) + self.assertEqual( datetime_to_str(0.1999992), "1970-01-01T00:00:00.199999Z" ) + self.assertEqual( datetime_to_str(0.1999998), "1970-01-01T00:00:00.200000Z" ) + self.assertEqual( datetime_to_str(0.1999999), "1970-01-01T00:00:00.200000Z" ) + self.assertEqual( datetime_to_str(0.200000), "1970-01-01T00:00:00.200000Z" ) + self.assertEqual( datetime_to_str(0.2000001), "1970-01-01T00:00:00.200000Z" ) + self.assertEqual( datetime_to_str(0.2000009), "1970-01-01T00:00:00.200001Z" ) + self.assertEqual( datetime_to_str(0.200001), "1970-01-01T00:00:00.200001Z" ) def test2_str_to_datetime(self): """Reading..."""