Skip to content

Commit 7ca0499

Browse files
authored
PYTHON-1603 Truncate large datetimes properly (mongodb#362)
1 parent 466fdde commit 7ca0499

File tree

2 files changed

+9
-2
lines changed

2 files changed

+9
-2
lines changed

bson/__init__.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -819,7 +819,7 @@ def _dict_to_bson(doc, check_keys, opts, top_level=True):
819819
def _millis_to_datetime(millis, opts):
820820
"""Convert milliseconds since epoch UTC to datetime."""
821821
diff = ((millis % 1000) + 1000) % 1000
822-
seconds = (millis - diff) / 1000
822+
seconds = (millis - diff) // 1000
823823
micros = diff * 1000
824824
if opts.tz_aware:
825825
dt = EPOCH_AWARE + datetime.timedelta(seconds=seconds,
@@ -837,7 +837,7 @@ def _datetime_to_millis(dtm):
837837
if dtm.utcoffset() is not None:
838838
dtm = dtm - dtm.utcoffset()
839839
return int(calendar.timegm(dtm.timetuple()) * 1000 +
840-
dtm.microsecond / 1000)
840+
dtm.microsecond // 1000)
841841

842842

843843
_CODEC_OPTIONS_TYPE_ERROR = TypeError(

test/test_bson.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -474,6 +474,13 @@ def test_datetime_encode_decode(self):
474474
dt2 = BSON.encode({"date": dt1}).decode()["date"]
475475
self.assertEqual(dt1, dt2)
476476

477+
def test_large_datetime_truncation(self):
478+
# Ensure that a large datetime is truncated correctly.
479+
dt1 = datetime.datetime(9999, 1, 1, 1, 1, 1, 999999)
480+
dt2 = BSON.encode({"date": dt1}).decode()["date"]
481+
self.assertEqual(dt2.microsecond, 999000)
482+
self.assertEqual(dt2.second, dt1.second)
483+
477484
def test_aware_datetime(self):
478485
aware = datetime.datetime(1993, 4, 4, 2,
479486
tzinfo=FixedOffset(555, "SomeZone"))

0 commit comments

Comments
 (0)