Skip to content

Commit ec34378

Browse files
authored
PYTHON-3702 Stop using utcnow and utcfromtimestamp (#1229)
1 parent 3f687f7 commit ec34378

File tree

11 files changed

+21
-17
lines changed

11 files changed

+21
-17
lines changed

bson/datetime_ms.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@
2626
from bson.tz_util import utc
2727

2828
EPOCH_AWARE = datetime.datetime.fromtimestamp(0, utc)
29-
EPOCH_NAIVE = datetime.datetime.utcfromtimestamp(0)
29+
EPOCH_NAIVE = datetime.datetime.fromtimestamp(0, tz=datetime.timezone.utc).replace(tzinfo=None)
3030

3131

3232
class DatetimeMS:

doc/examples/datetimes.rst

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,10 +25,12 @@ time into MongoDB:
2525

2626
.. doctest::
2727

28-
>>> result = db.objects.insert_one({"last_modified": datetime.datetime.utcnow()})
28+
>>> result = db.objects.insert_one(
29+
... {"last_modified": datetime.datetime.now(tz=timezone.utc)}
30+
... )
2931

30-
Always use :meth:`datetime.datetime.utcnow`, which returns the current time in
31-
UTC, instead of :meth:`datetime.datetime.now`, which returns the current local
32+
Always use :meth:`datetime.datetime.now(tz=timezone.utc)`, which explicitly returns the current time in
33+
UTC, instead of :meth:`datetime.datetime.now`, with no arguments, which returns the current local
3234
time. Avoid doing this:
3335

3436
.. doctest::

doc/tutorial.rst

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -109,7 +109,7 @@ post:
109109
... "author": "Mike",
110110
... "text": "My first blog post!",
111111
... "tags": ["mongodb", "python", "pymongo"],
112-
... "date": datetime.datetime.utcnow(),
112+
... "date": datetime.datetime.now(tz=timezone.utc),
113113
... }
114114

115115
Note that documents can contain native Python types (like

gridfs/grid_file.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -292,7 +292,7 @@ def __flush(self) -> Any:
292292
self.__flush_buffer()
293293
# The GridFS spec says length SHOULD be an Int64.
294294
self._file["length"] = Int64(self._position)
295-
self._file["uploadDate"] = datetime.datetime.utcnow()
295+
self._file["uploadDate"] = datetime.datetime.now(tz=datetime.timezone.utc)
296296

297297
return self._coll.files.insert_one(self._file, session=self._session)
298298
except DuplicateKeyError:

pymongo/ocsp_cache.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616

1717
from collections import namedtuple
1818
from datetime import datetime as _datetime
19+
from datetime import timezone
1920

2021
from pymongo.lock import _create_lock
2122

@@ -60,7 +61,7 @@ def __setitem__(self, key, value):
6061
return
6162

6263
# Do nothing if the response is invalid.
63-
if not (value.this_update <= _datetime.utcnow() < value.next_update):
64+
if not (value.this_update <= _datetime.now(tz=timezone.utc) < value.next_update):
6465
return
6566

6667
# Cache new response OR update cached response if new response
@@ -81,7 +82,7 @@ def __getitem__(self, item):
8182
value = self._data[cache_key]
8283

8384
# Return cached response if it is still valid.
84-
if value.this_update <= _datetime.utcnow() < value.next_update:
85+
if value.this_update <= _datetime.now(tz=timezone.utc) < value.next_update:
8586
return value
8687

8788
self._data.pop(cache_key, None)

pymongo/ocsp_support.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
import logging as _logging
1818
import re as _re
1919
from datetime import datetime as _datetime
20+
from datetime import timezone
2021

2122
from cryptography.exceptions import InvalidSignature as _InvalidSignature
2223
from cryptography.hazmat.backends import default_backend as _default_backend
@@ -219,7 +220,7 @@ def _verify_response(issuer, response):
219220

220221
# Note that we are not using a "tolerance period" as discussed in
221222
# https://tools.ietf.org/rfc/rfc5019.txt?
222-
now = _datetime.utcnow()
223+
now = _datetime.now(tz=timezone.utc)
223224
# RFC6960, Section 3.2, Number 5
224225
if response.this_update > now:
225226
_LOGGER.debug("thisUpdate is in the future")

test/test_bson.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -986,7 +986,7 @@ def test_codec_options_repr(self):
986986
def test_decode_all_defaults(self):
987987
# Test decode_all()'s default document_class is dict and tz_aware is
988988
# False.
989-
doc = {"sub_document": {}, "dt": datetime.datetime.utcnow()}
989+
doc = {"sub_document": {}, "dt": datetime.datetime.now(tz=datetime.timezone.utc)}
990990

991991
decoded = bson.decode_all(bson.encode(doc))[0]
992992
self.assertIsInstance(decoded["sub_document"], dict)
@@ -998,7 +998,7 @@ def test_decode_all_defaults(self):
998998
def test_decode_all_no_options(self):
999999
# Test decode_all()'s default document_class is dict and tz_aware is
10001000
# False.
1001-
doc = {"sub_document": {}, "dt": datetime.datetime.utcnow()}
1001+
doc = {"sub_document": {}, "dt": datetime.datetime.now(tz=datetime.timezone.utc)}
10021002

10031003
decoded = bson.decode_all(bson.encode(doc), None)[0]
10041004
self.assertIsInstance(decoded["sub_document"], dict)

test/test_client.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1143,7 +1143,7 @@ def test_tz_aware(self):
11431143
naive = self.client
11441144
aware.pymongo_test.drop_collection("test")
11451145

1146-
now = datetime.datetime.utcnow()
1146+
now = datetime.datetime.now(tz=datetime.timezone.utc)
11471147
aware.pymongo_test.test.insert_one({"x": now})
11481148

11491149
self.assertEqual(None, naive.pymongo_test.test.find_one()["x"].tzinfo)

test/test_objectid.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@ def test_binary_str_equivalence(self):
8686
self.assertEqual(a, ObjectId(str(a)))
8787

8888
def test_generation_time(self):
89-
d1 = datetime.datetime.utcnow()
89+
d1 = datetime.datetime.now(tz=datetime.timezone.utc).replace(tzinfo=None)
9090
d2 = ObjectId().generation_time
9191

9292
self.assertEqual(utc, d2.tzinfo)
@@ -97,7 +97,7 @@ def test_from_datetime(self):
9797
if "PyPy 1.8.0" in sys.version:
9898
# See https://bugs.pypy.org/issue1092
9999
raise SkipTest("datetime.timedelta is broken in pypy 1.8.0")
100-
d = datetime.datetime.utcnow()
100+
d = datetime.datetime.now(tz=datetime.timezone.utc).replace(tzinfo=None)
101101
d = d - datetime.timedelta(microseconds=d.microsecond)
102102
oid = ObjectId.from_datetime(d)
103103
self.assertEqual(d, oid.generation_time.replace(tzinfo=None))

test/test_ocsp_cache.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
import random
1818
import sys
1919
from collections import namedtuple
20-
from datetime import datetime, timedelta
20+
from datetime import datetime, timedelta, timezone
2121
from os import urandom
2222
from time import sleep
2323
from typing import Any
@@ -61,7 +61,7 @@ def _create_mock_request(self):
6161
)
6262

6363
def _create_mock_response(self, this_update_delta_seconds, next_update_delta_seconds):
64-
now = datetime.utcnow()
64+
now = datetime.now(tz=timezone.utc)
6565
this_update = now + timedelta(seconds=this_update_delta_seconds)
6666
if next_update_delta_seconds is not None:
6767
next_update = now + timedelta(seconds=next_update_delta_seconds)

0 commit comments

Comments
 (0)