diff --git a/reviewboard/accounts/tests/test_update_last_login_middleware.py b/reviewboard/accounts/tests/test_update_last_login_middleware.py
index 3713d8d8997b4371af36693649e628eef2659480..11faf63f30e869e9de5cca73c1118eb54b8b3adc 100644
--- a/reviewboard/accounts/tests/test_update_last_login_middleware.py
+++ b/reviewboard/accounts/tests/test_update_last_login_middleware.py
@@ -1,11 +1,11 @@
 """Unit tests for reviewboard.accounts.middleware.UpdateLastLoginMiddleware."""
 
-from datetime import datetime, timedelta
+from datetime import datetime, timedelta, timezone
 
 from django.contrib.auth.models import User
 from django.http import HttpResponse
 from django.test.client import RequestFactory
-from django.utils import timezone
+from django.utils import timezone as django_timezone
 from kgb import SpyAgency
 
 from reviewboard.accounts.middleware import update_last_login_middleware
@@ -27,12 +27,12 @@ class UpdateLastLoginMiddlewareTests(SpyAgency, TestCase):
         self.request = RequestFactory().get('/')
         self.request.user = self.user
 
-        self.spy_on(timezone.now,
+        self.spy_on(django_timezone.now,
                     call_fake=lambda: datetime(year=2018, month=3, day=3,
                                                hour=19, minute=30, second=0,
                                                tzinfo=timezone.utc))
 
-        self.now = timezone.now()
+        self.now = django_timezone.now()
 
     def test_process_request_with_gt_30_mins(self):
         """Testing update_last_login_middleware with last login time > 30
diff --git a/reviewboard/certs/cert.py b/reviewboard/certs/cert.py
index 4dc843fd7fb8517b28319aa06fd8d47d397a2d5e..99ca7edfadbdbf7c510c0601a30439e3d60edcab 100644
--- a/reviewboard/certs/cert.py
+++ b/reviewboard/certs/cert.py
@@ -10,7 +10,7 @@ import logging
 import os
 import re
 
-from datetime import datetime
+from datetime import datetime, timezone
 from enum import Enum
 from typing import Optional, TYPE_CHECKING, Type, TypeVar
 from uuid import uuid4
@@ -18,7 +18,7 @@ from uuid import uuid4
 from cryptography import x509
 from cryptography.hazmat.primitives import hashes
 from cryptography.x509.oid import NameOID
-from django.utils import timezone
+from django.utils import timezone as django_timezone
 from django.utils.encoding import force_str
 from django.utils.functional import cached_property
 from djblets.util.symbols import UNSET, Unsettable
@@ -570,10 +570,11 @@ class Certificate:
                 If not provided, this will be loaded from ``cert_data`` when
                 needed (and if ``cert_data`` is provided).
         """
-        if valid_from is not UNSET and timezone.is_naive(valid_from):
+        if valid_from is not UNSET and django_timezone.is_naive(valid_from):
             raise ValueError('valid_from must contain a timezone.')
 
-        if valid_through is not UNSET and timezone.is_naive(valid_through):
+        if (valid_through is not UNSET and
+            django_timezone.is_naive(valid_through)):
             raise ValueError('valid_through must contain a timezone.')
 
         self.cert_data = cert_data
@@ -709,7 +710,7 @@ class Certificate:
 
         return (valid_from is not None and
                 valid_through is not None and
-                valid_from <= timezone.now() <= valid_through)
+                valid_from <= django_timezone.now() <= valid_through)
 
     @property
     def is_wildcard(self) -> bool:
@@ -876,9 +877,9 @@ class Certificate:
                     .value
                 )
             elif (isinstance(x509_value, datetime) and
-                  timezone.is_naive(x509_value)):
-                x509_value = timezone.make_aware(x509_value,
-                                                 timezone=timezone.utc)
+                  django_timezone.is_naive(x509_value)):
+                x509_value = django_timezone.make_aware(x509_value,
+                                                        timezone=timezone.utc)
 
             assert isinstance(x509_value, attr_type)
 
diff --git a/reviewboard/certs/tests/test_certificate.py b/reviewboard/certs/tests/test_certificate.py
index dfc02f158b69f9cc4fe8959172ca31d82965ad98..2c0d65456c2032b90f0b6b3b9b41447c184ea386 100644
--- a/reviewboard/certs/tests/test_certificate.py
+++ b/reviewboard/certs/tests/test_certificate.py
@@ -9,11 +9,10 @@ from __future__ import annotations
 import json
 import os
 import tempfile
-from datetime import datetime, timedelta
+from datetime import datetime, timedelta, timezone
 
 import kgb
 from cryptography.x509.oid import NameOID
-from django.utils import timezone
 from djblets.util.serializers import DjbletsJSONEncoder
 
 from reviewboard.certs.cert import Certificate, CertificateFingerprints
diff --git a/reviewboard/certs/tests/test_certificate_verification_error.py b/reviewboard/certs/tests/test_certificate_verification_error.py
index 7bc75f4006a61e972a1e662753d51d7f5b461228..24eef03d1970cc9e68c2c0a29e528c1ec1d462bf 100644
--- a/reviewboard/certs/tests/test_certificate_verification_error.py
+++ b/reviewboard/certs/tests/test_certificate_verification_error.py
@@ -6,9 +6,7 @@ Version Added:
 
 from __future__ import annotations
 
-from datetime import datetime
-
-from django.utils import timezone
+from datetime import datetime, timezone
 
 from reviewboard.certs.cert import Certificate, CertificateFingerprints
 from reviewboard.certs.errors import (CertificateVerificationError,
diff --git a/reviewboard/reviews/detail.py b/reviewboard/reviews/detail.py
index 76dbaf6f33e947ed8a7329d98de8bf789fb8f2cf..f32612a160a348f27874cfffeb245a4f34d7b4b6 100644
--- a/reviewboard/reviews/detail.py
+++ b/reviewboard/reviews/detail.py
@@ -3,12 +3,11 @@
 import hashlib
 import logging
 from collections import Counter, defaultdict
-from datetime import datetime
+from datetime import datetime, timezone
 from itertools import chain
 from typing import Optional
 
 from django.db.models import Q
-from django.utils.timezone import utc
 from django.utils.translation import gettext as _
 from djblets.registries.registry import (ALREADY_REGISTERED,
                                          ATTRIBUTE_REGISTERED,
@@ -305,7 +304,8 @@ class ReviewRequestPageData(object):
             )
 
         if len(self.reviews) == 0:
-            self.latest_review_timestamp = datetime.fromtimestamp(0, utc)
+            self.latest_review_timestamp = \
+                datetime.fromtimestamp(0, timezone.utc)
         else:
             self.latest_review_timestamp = self.reviews[0].timestamp
 
@@ -378,7 +378,7 @@ class ReviewRequestPageData(object):
             parent_id = review.base_reply_to_id
 
             if parent_id is not None:
-                new_timestamp = review.timestamp.replace(tzinfo=utc)
+                new_timestamp = review.timestamp.replace(tzinfo=timezone.utc)
 
                 if parent_id in self.latest_timestamps_by_review_id:
                     old_timestamp = \
@@ -560,7 +560,8 @@ class ReviewRequestPageData(object):
                 comment.timestamp
                 for comment in self.all_comments)
         else:
-            self.latest_issue_timestamp = datetime.fromtimestamp(0, utc)
+            self.latest_issue_timestamp = \
+                datetime.fromtimestamp(0, timezone.utc)
 
         if self.review_request.created_with_history:
             pks = [diffset.pk for diffset in self.diffsets]
diff --git a/reviewboard/reviews/tests/test_entries.py b/reviewboard/reviews/tests/test_entries.py
index 6609e1cd472f7f2f797e6b508a5c250696195476..511035dd0a1ce50d6abf04da7ce130aa1f8f1904 100644
--- a/reviewboard/reviews/tests/test_entries.py
+++ b/reviewboard/reviews/tests/test_entries.py
@@ -1,12 +1,11 @@
 """Unit tests for review request page entries."""
 
-from datetime import datetime, timedelta
+from datetime import datetime, timedelta, timezone
 
 from django.contrib.auth.models import AnonymousUser, User
 from django.template import RequestContext
 from django.test.client import RequestFactory
-from django.utils import timezone
-from django.utils.timezone import utc
+from django.utils.timezone import now
 from djblets.testing.decorators import add_fixtures
 from kgb import SpyAgency
 
@@ -45,10 +44,11 @@ class BaseReviewRequestPageEntryTests(SpyAgency, TestCase):
         entry = BaseReviewRequestPageEntry(
             data=self.data,
             entry_id='test',
-            added_timestamp=datetime(2017, 9, 7, 17, 0, 0, tzinfo=utc))
+            added_timestamp=datetime(2017, 9, 7, 17, 0, 0,
+                                     tzinfo=timezone.utc))
 
         self.assertEqual(entry.updated_timestamp,
-                         datetime(2017, 9, 7, 17, 0, 0, tzinfo=utc))
+                         datetime(2017, 9, 7, 17, 0, 0, tzinfo=timezone.utc))
 
     def test_render_to_string(self):
         """Testing BaseReviewRequestPageEntry.render_to_string"""
@@ -60,7 +60,7 @@ class BaseReviewRequestPageEntryTests(SpyAgency, TestCase):
         html = entry.render_to_string(
             self.request,
             RequestContext(self.request, {
-                'last_visited': timezone.now(),
+                'last_visited': now(),
             }))
 
         self.assertNotEqual(html, '')
@@ -78,7 +78,7 @@ class BaseReviewRequestPageEntryTests(SpyAgency, TestCase):
         html = entry.render_to_string(
             self.request,
             RequestContext(self.request, {
-                'last_visited': timezone.now(),
+                'last_visited': now(),
             }))
         self.assertIn('<div class="box-statuses">', html)
 
@@ -95,7 +95,7 @@ class BaseReviewRequestPageEntryTests(SpyAgency, TestCase):
         html = entry.render_to_string(
             self.request,
             RequestContext(self.request, {
-                'last_visited': timezone.now(),
+                'last_visited': now(),
             }))
         self.assertNotIn('<div class="box-statuses">', html)
 
@@ -106,7 +106,8 @@ class BaseReviewRequestPageEntryTests(SpyAgency, TestCase):
         entry = BaseReviewRequestPageEntry(
             data=self.data,
             entry_id='test',
-            added_timestamp=datetime(2017, 9, 7, 17, 0, 0, tzinfo=utc))
+            added_timestamp=datetime(2017, 9, 7, 17, 0, 0,
+                                     tzinfo=timezone.utc))
         entry.template_name = 'reviews/entries/base.html'
 
         self.request.user = User.objects.create_user(username='test-user',
@@ -115,7 +116,8 @@ class BaseReviewRequestPageEntryTests(SpyAgency, TestCase):
         html = entry.render_to_string(
             self.request,
             RequestContext(self.request, {
-                'last_visited': datetime(2017, 9, 7, 10, 0, 0, tzinfo=utc),
+                'last_visited': datetime(2017, 9, 7, 10, 0, 0,
+                                         tzinfo=timezone.utc),
             }))
 
         self.assertIn(
@@ -129,7 +131,8 @@ class BaseReviewRequestPageEntryTests(SpyAgency, TestCase):
         entry = BaseReviewRequestPageEntry(
             data=self.data,
             entry_id='test',
-            added_timestamp=datetime(2017, 9, 7, 17, 0, 0, tzinfo=utc))
+            added_timestamp=datetime(2017, 9, 7, 17, 0, 0,
+                                     tzinfo=timezone.utc))
         entry.template_name = 'reviews/entries/base.html'
 
         self.request.user = User.objects.create_user(username='test-user',
@@ -138,7 +141,8 @@ class BaseReviewRequestPageEntryTests(SpyAgency, TestCase):
         html = entry.render_to_string(
             self.request,
             RequestContext(self.request, {
-                'last_visited': datetime(2017, 9, 7, 18, 0, 0, tzinfo=utc),
+                'last_visited': datetime(2017, 9, 7, 18, 0, 0,
+                                         tzinfo=timezone.utc),
             }))
 
         self.assertNotEqual(html, '')
@@ -157,7 +161,7 @@ class BaseReviewRequestPageEntryTests(SpyAgency, TestCase):
         html = entry.render_to_string(
             self.request,
             RequestContext(self.request, {
-                'last_visited': timezone.now(),
+                'last_visited': now(),
             }))
         self.assertEqual(html, '')
 
@@ -174,7 +178,7 @@ class BaseReviewRequestPageEntryTests(SpyAgency, TestCase):
         html = entry.render_to_string(
             self.request,
             RequestContext(self.request, {
-                'last_visited': timezone.now(),
+                'last_visited': now(),
             }))
         self.assertEqual(html, '')
 
@@ -194,7 +198,7 @@ class BaseReviewRequestPageEntryTests(SpyAgency, TestCase):
         html = entry.render_to_string(
             self.request,
             RequestContext(self.request, {
-                'last_visited': timezone.now(),
+                'last_visited': now(),
             }))
 
         self.assertEqual(html, '')
@@ -207,19 +211,20 @@ class BaseReviewRequestPageEntryTests(SpyAgency, TestCase):
         entry = BaseReviewRequestPageEntry(
             data=self.data,
             entry_id='test',
-            added_timestamp=datetime(2017, 9, 7, 15, 36, 0, tzinfo=utc))
+            added_timestamp=datetime(2017, 9, 7, 15, 36, 0,
+                                     tzinfo=timezone.utc))
 
         user = User.objects.create_user(username='test-user',
                                         email='user@example.com')
 
         self.assertTrue(entry.is_entry_new(
-            last_visited=datetime(2017, 9, 7, 10, 0, 0, tzinfo=utc),
+            last_visited=datetime(2017, 9, 7, 10, 0, 0, tzinfo=timezone.utc),
             user=user))
         self.assertFalse(entry.is_entry_new(
-            last_visited=datetime(2017, 9, 7, 16, 0, 0, tzinfo=utc),
+            last_visited=datetime(2017, 9, 7, 16, 0, 0, tzinfo=timezone.utc),
             user=user))
         self.assertFalse(entry.is_entry_new(
-            last_visited=datetime(2017, 9, 7, 15, 36, 0, tzinfo=utc),
+            last_visited=datetime(2017, 9, 7, 15, 36, 0, tzinfo=timezone.utc),
             user=user))
 
     def test_is_entry_new_without_timestamp(self):
@@ -230,7 +235,7 @@ class BaseReviewRequestPageEntryTests(SpyAgency, TestCase):
                                            added_timestamp=None)
 
         self.assertFalse(entry.is_entry_new(
-            last_visited=datetime(2017, 9, 7, 10, 0, 0, tzinfo=utc),
+            last_visited=datetime(2017, 9, 7, 10, 0, 0, tzinfo=timezone.utc),
             user=User.objects.create_user(username='test-user',
                                           email='user@example.com')))
 
@@ -240,7 +245,8 @@ class BaseReviewRequestPageEntryTests(SpyAgency, TestCase):
         """
         self.data.latest_changedesc_timestamp = \
             self.review_request.time_added + timedelta(days=5)
-        self.data.last_visited = datetime(2017, 9, 7, 10, 0, 0, tzinfo=utc)
+        self.data.last_visited = datetime(2017, 9, 7, 10, 0, 0,
+                                          tzinfo=timezone.utc)
 
         entry = BaseReviewRequestPageEntry(
             data=self.data,
@@ -253,7 +259,8 @@ class BaseReviewRequestPageEntryTests(SpyAgency, TestCase):
         """Testing BaseReviewRequestPageEntry.collapsed with entry newer than
         last visited
         """
-        self.data.last_visited = datetime(2017, 9, 7, 10, 0, 0, tzinfo=utc)
+        self.data.last_visited = datetime(2017, 9, 7, 10, 0, 0,
+                                          tzinfo=timezone.utc)
 
         entry = BaseReviewRequestPageEntry(
             data=self.data,
@@ -269,8 +276,10 @@ class BaseReviewRequestPageEntryTests(SpyAgency, TestCase):
         entry = BaseReviewRequestPageEntry(
             data=self.data,
             entry_id='test',
-            added_timestamp=datetime(2017, 9, 6, 10, 0, 0, tzinfo=utc),
-            updated_timestamp=datetime(2017, 9, 7, 10, 0, 0, tzinfo=utc))
+            added_timestamp=datetime(2017, 9, 6, 10, 0, 0,
+                                     tzinfo=timezone.utc),
+            updated_timestamp=datetime(2017, 9, 7, 10, 0, 0,
+                                       tzinfo=timezone.utc))
         self.assertFalse(entry.collapsed)
 
     def test_collapsed_with_older_than_changedesc(self):
@@ -759,17 +768,17 @@ class InitialStatusUpdatesEntryTests(TestCase):
         self.request.user = AnonymousUser()
 
         self.review_request = self.create_review_request(
-            time_added=datetime(2017, 9, 7, 17, 0, 0, tzinfo=utc))
+            time_added=datetime(2017, 9, 7, 17, 0, 0, tzinfo=timezone.utc))
         self.review = self.create_review(
             self.review_request,
             public=True,
-            timestamp=datetime(2017, 9, 14, 15, 40, 0, tzinfo=utc))
+            timestamp=datetime(2017, 9, 14, 15, 40, 0, tzinfo=timezone.utc))
         self.general_comment = self.create_general_comment(self.review,
                                                            issue_opened=False)
         self.status_update = self.create_status_update(
             self.review_request,
             review=self.review,
-            timestamp=datetime(2017, 9, 14, 15, 40, 0, tzinfo=utc),
+            timestamp=datetime(2017, 9, 14, 15, 40, 0, tzinfo=timezone.utc),
             state=StatusUpdate.DONE_FAILURE)
 
         self.data = ReviewRequestPageData(
@@ -785,7 +794,7 @@ class InitialStatusUpdatesEntryTests(TestCase):
         entry = InitialStatusUpdatesEntry(data=self.data)
 
         self.assertEqual(entry.added_timestamp,
-                         datetime(2017, 9, 7, 17, 0, 0, tzinfo=utc))
+                         datetime(2017, 9, 7, 17, 0, 0, tzinfo=timezone.utc))
 
     def test_updated_timestamp(self):
         """Testing InitialStatusUpdatesEntry.updated_timestamp"""
@@ -795,7 +804,7 @@ class InitialStatusUpdatesEntryTests(TestCase):
         entry = InitialStatusUpdatesEntry(data=self.data)
 
         self.assertEqual(entry.updated_timestamp,
-                         datetime(2017, 9, 14, 15, 40, 0, tzinfo=utc))
+                         datetime(2017, 9, 14, 15, 40, 0, tzinfo=timezone.utc))
 
     def test_build_entries(self):
         """Testing InitialStatusUpdatesEntry.build_entries"""
@@ -807,9 +816,9 @@ class InitialStatusUpdatesEntryTests(TestCase):
 
         entry = entries[0]
         self.assertEqual(entry.added_timestamp,
-                         datetime(2017, 9, 7, 17, 0, 0, tzinfo=utc))
+                         datetime(2017, 9, 7, 17, 0, 0, tzinfo=timezone.utc))
         self.assertEqual(entry.updated_timestamp,
-                         datetime(2017, 9, 14, 15, 40, 0, tzinfo=utc))
+                         datetime(2017, 9, 14, 15, 40, 0, tzinfo=timezone.utc))
         self.assertEqual(entry.status_updates, [self.status_update])
         self.assertEqual(
             entry.status_updates_by_review,
@@ -1086,7 +1095,7 @@ class ReviewEntryTests(TestCase):
             self.review_request,
             id=123,
             public=True,
-            timestamp=datetime(2017, 9, 7, 17, 0, 0, tzinfo=utc))
+            timestamp=datetime(2017, 9, 7, 17, 0, 0, tzinfo=timezone.utc))
 
         self.changedesc = self.review_request.changedescs.create(
             timestamp=self.review.timestamp + timedelta(days=10),
@@ -1106,7 +1115,7 @@ class ReviewEntryTests(TestCase):
                             review=self.review)
 
         self.assertEqual(entry.added_timestamp,
-                         datetime(2017, 9, 7, 17, 0, 0, tzinfo=utc))
+                         datetime(2017, 9, 7, 17, 0, 0, tzinfo=timezone.utc))
 
     def test_updated_timestamp(self):
         """Testing ReviewEntry.updated_timestamp"""
@@ -1117,13 +1126,13 @@ class ReviewEntryTests(TestCase):
                             review=self.review)
 
         self.assertEqual(entry.updated_timestamp,
-                         datetime(2017, 9, 7, 17, 0, 0, tzinfo=utc))
+                         datetime(2017, 9, 7, 17, 0, 0, tzinfo=timezone.utc))
 
     def test_updated_timestamp_with_replies(self):
         """Testing ReviewEntry.updated_timestamp with replies"""
         self.create_reply(self.review,
                           timestamp=datetime(2017, 9, 14, 15, 40, 0,
-                                             tzinfo=utc),
+                                             tzinfo=timezone.utc),
                           publish=True)
 
         self.data.query_data_pre_etag()
@@ -1133,7 +1142,7 @@ class ReviewEntryTests(TestCase):
                             review=self.review)
 
         self.assertEqual(entry.updated_timestamp,
-                         datetime(2017, 9, 14, 15, 40, 0, tzinfo=utc))
+                         datetime(2017, 9, 14, 15, 40, 0, tzinfo=timezone.utc))
 
     def test_get_dom_element_id(self):
         """Testing ReviewEntry.get_dom_element_id"""
@@ -1470,7 +1479,7 @@ class ChangeEntryTests(TestCase):
         self.changedesc = ChangeDescription.objects.create(
             id=123,
             public=True,
-            timestamp=datetime(2017, 9, 7, 17, 0, 0, tzinfo=utc))
+            timestamp=datetime(2017, 9, 7, 17, 0, 0, tzinfo=timezone.utc))
         self.review_request.changedescs.add(self.changedesc)
         self.data = ReviewRequestPageData(review_request=self.review_request,
                                           request=self.request)
@@ -1484,7 +1493,7 @@ class ChangeEntryTests(TestCase):
                             changedesc=self.changedesc)
 
         self.assertEqual(entry.added_timestamp,
-                         datetime(2017, 9, 7, 17, 0, 0, tzinfo=utc))
+                         datetime(2017, 9, 7, 17, 0, 0, tzinfo=timezone.utc))
 
     def test_updated_timestamp(self):
         """Testing ChangeEntry.updated_timestamp"""
@@ -1495,14 +1504,14 @@ class ChangeEntryTests(TestCase):
                             changedesc=self.changedesc)
 
         self.assertEqual(entry.updated_timestamp,
-                         datetime(2017, 9, 7, 17, 0, 0, tzinfo=utc))
+                         datetime(2017, 9, 7, 17, 0, 0, tzinfo=timezone.utc))
 
     def test_updated_timestamp_with_status_update(self):
         """Testing ChangeEntry.updated_timestamp with status updates"""
         self.create_status_update(
             self.review_request,
             change_description=self.changedesc,
-            timestamp=datetime(2017, 9, 14, 15, 40, 0, tzinfo=utc))
+            timestamp=datetime(2017, 9, 14, 15, 40, 0, tzinfo=timezone.utc))
 
         self.data.query_data_pre_etag()
         self.data.query_data_post_etag()
@@ -1511,7 +1520,7 @@ class ChangeEntryTests(TestCase):
                             changedesc=self.changedesc)
 
         self.assertEqual(entry.updated_timestamp,
-                         datetime(2017, 9, 14, 15, 40, 0, tzinfo=utc))
+                         datetime(2017, 9, 14, 15, 40, 0, tzinfo=timezone.utc))
 
     def test_get_dom_element_id(self):
         """Testing ChangeEntry.get_dom_element_id"""
diff --git a/reviewboard/reviews/tests/test_review.py b/reviewboard/reviews/tests/test_review.py
index 934c355e9cbcfe2030eed03cf90f9a90bcd02444..b0c1415b6f65e353a9850348635db6aae4be6928 100644
--- a/reviewboard/reviews/tests/test_review.py
+++ b/reviewboard/reviews/tests/test_review.py
@@ -1,9 +1,9 @@
 """Unit tests for reviewboard.reviews.models.Review."""
 
-from datetime import datetime, timedelta
+from datetime import datetime, timedelta, timezone
 
 from django.contrib.auth.models import AnonymousUser, User
-from django.utils import timezone
+from django.utils import timezone as django_timezone
 from djblets.testing.decorators import add_fixtures
 from djblets.util.dates import get_tz_aware_utcnow
 from kgb import SpyAgency, spy_on
@@ -408,16 +408,17 @@ class ReviewTests(SpyAgency, TestCase):
         # Unfortunately, we cannot spy on datetime.utcnow since it is a
         # builtin. So we replace get_tz_aware_utcnow with timezone.now and we
         # will replace that with a constant function in the spy_on calls below.
-        self.spy_on(get_tz_aware_utcnow, call_fake=lambda: timezone.now())
+        self.spy_on(get_tz_aware_utcnow,
+                    call_fake=lambda: django_timezone.now())
 
         creation_timestamp = datetime.fromtimestamp(0, timezone.utc)
         review_timestamp = creation_timestamp + timedelta(hours=1)
         revoke_timestamp = review_timestamp + timedelta(hours=1)
 
-        with spy_on(timezone.now, call_fake=lambda: creation_timestamp):
+        with spy_on(django_timezone.now, call_fake=lambda: creation_timestamp):
             review_request = self.create_review_request(publish=True)
 
-        with spy_on(timezone.now, call_fake=lambda: review_timestamp):
+        with spy_on(django_timezone.now, call_fake=lambda: review_timestamp):
             review = self.create_review(review_request,
                                         body_top=Review.SHIP_IT_TEXT,
                                         ship_it=True,
@@ -429,7 +430,7 @@ class ReviewTests(SpyAgency, TestCase):
         self.assertEqual(review_request.last_updated, review_timestamp)
         self.assertEqual(review.timestamp, review_timestamp)
 
-        with spy_on(timezone.now, call_fake=lambda: revoke_timestamp):
+        with spy_on(django_timezone.now, call_fake=lambda: revoke_timestamp):
             review.revoke_ship_it(review.user)
 
         review = Review.objects.get(pk=review.pk)
diff --git a/reviewboard/reviews/tests/test_review_request_updates_view.py b/reviewboard/reviews/tests/test_review_request_updates_view.py
index 5c37d0a726787960707c9d8c99d88ca27c6053a3..49bd6bf31de4bb28dc09a8f29cc331ec3be490bf 100644
--- a/reviewboard/reviews/tests/test_review_request_updates_view.py
+++ b/reviewboard/reviews/tests/test_review_request_updates_view.py
@@ -3,10 +3,9 @@
 
 import json
 import struct
-from datetime import datetime, timedelta
+from datetime import datetime, timedelta, timezone
 
 from django.urls import reverse
-from django.utils.timezone import utc
 
 from reviewboard.reviews.views import ReviewRequestUpdatesView
 from reviewboard.testing import TestCase
@@ -22,8 +21,8 @@ class ReviewRequestUpdatesViewTests(TestCase):
 
         self.review_request = self.create_review_request(
             publish=True,
-            time_added=datetime(2017, 9, 7, 17, 0, 0, tzinfo=utc),
-            last_updated=datetime(2017, 9, 7, 23, 10, 0, tzinfo=utc))
+            time_added=datetime(2017, 9, 7, 17, 0, 0, tzinfo=timezone.utc),
+            last_updated=datetime(2017, 9, 7, 23, 10, 0, tzinfo=timezone.utc))
 
         # Create the first review.
         self.review1 = self.create_review(
diff --git a/reviewboard/reviews/tests/test_review_request_view_mixin.py b/reviewboard/reviews/tests/test_review_request_view_mixin.py
index 1a06aadedc561c26877dfe0c72dd6fc2fc251cc7..e4699d4acd6f9cea26502dff17131452e3ea5bf7 100644
--- a/reviewboard/reviews/tests/test_review_request_view_mixin.py
+++ b/reviewboard/reviews/tests/test_review_request_view_mixin.py
@@ -1,9 +1,9 @@
 """Unit tests for reviewboard.reviews.views.ReviewRequestViewMixin."""
 
-from datetime import datetime
+from datetime import datetime, timezone
 
 import pytz
-from django.utils import timezone
+from django.utils import timezone as django_timezone
 
 from reviewboard.reviews.models import ReviewRequest
 from reviewboard.reviews.models.review_request import ReviewRequestCloseInfo
@@ -30,7 +30,7 @@ class ReviewRequestViewMixinTests(TestCase):
         mixin = ReviewRequestViewMixin()
         mixin.review_request = review_request
 
-        with timezone.override(_local_timezone):
+        with django_timezone.override(_local_timezone):
             html = mixin.get_review_request_status_html(
                 review_request_details=review_request,
                 close_info=ReviewRequestCloseInfo(
@@ -56,7 +56,7 @@ class ReviewRequestViewMixinTests(TestCase):
         mixin = ReviewRequestViewMixin()
         mixin.review_request = review_request
 
-        with timezone.override(_local_timezone):
+        with django_timezone.override(_local_timezone):
             html = mixin.get_review_request_status_html(
                 review_request_details=review_request,
                 close_info=ReviewRequestCloseInfo(
@@ -77,7 +77,7 @@ class ReviewRequestViewMixinTests(TestCase):
         mixin = ReviewRequestViewMixin()
         mixin.review_request = review_request
 
-        with timezone.override(_local_timezone):
+        with django_timezone.override(_local_timezone):
             html = mixin.get_review_request_status_html(
                 review_request_details=review_request,
                 close_info=ReviewRequestCloseInfo(
@@ -103,7 +103,7 @@ class ReviewRequestViewMixinTests(TestCase):
         mixin = ReviewRequestViewMixin()
         mixin.review_request = review_request
 
-        with timezone.override(_local_timezone):
+        with django_timezone.override(_local_timezone):
             html = mixin.get_review_request_status_html(
                 review_request_details=review_request,
                 close_info=ReviewRequestCloseInfo(
@@ -126,7 +126,7 @@ class ReviewRequestViewMixinTests(TestCase):
         mixin = ReviewRequestViewMixin()
         mixin.review_request = review_request
 
-        with timezone.override(_local_timezone):
+        with django_timezone.override(_local_timezone):
             html = mixin.get_review_request_status_html(
                 review_request_details=review_request,
                 close_info=ReviewRequestCloseInfo(
@@ -153,7 +153,7 @@ class ReviewRequestViewMixinTests(TestCase):
         mixin = ReviewRequestViewMixin()
         mixin.review_request = review_request
 
-        with timezone.override(_local_timezone):
+        with django_timezone.override(_local_timezone):
             html = mixin.get_review_request_status_html(
                 review_request_details=review_request,
                 close_info=ReviewRequestCloseInfo(
diff --git a/reviewboard/reviews/views/review_request_detail.py b/reviewboard/reviews/views/review_request_detail.py
index 364c9d6215ef3bc17b317ebbc9d976936e01a65d..7f18a976c2f38545f9a661088941f89734322f60 100644
--- a/reviewboard/reviews/views/review_request_detail.py
+++ b/reviewboard/reviews/views/review_request_detail.py
@@ -1,13 +1,12 @@
 """Main review request page view."""
 
 import logging
-from datetime import datetime
+from datetime import datetime, timezone
 from typing import Any, Dict, List, Optional, TYPE_CHECKING, Tuple
 
 from django.conf import settings
 from django.http import HttpRequest
-from django.utils import timezone
-from django.utils.timezone import utc
+from django.utils import timezone as django_timezone
 from django.views.generic.base import TemplateView
 from djblets.views.generic.etag import ETagViewMixin
 
@@ -171,7 +170,7 @@ class ReviewRequestDetailView(ReviewRequestViewMixin,
                 visited, visited_is_new = \
                     ReviewRequestVisit.objects.get_or_create(
                         user=user, review_request=review_request)
-                last_visited = visited.timestamp.replace(tzinfo=utc)
+                last_visited = visited.timestamp.replace(tzinfo=timezone.utc)
             except ReviewRequestVisit.DoesNotExist:
                 # Somehow, this visit was seen as created but then not
                 # accessible. We need to log this and then continue on.
@@ -186,7 +185,7 @@ class ReviewRequestDetailView(ReviewRequestViewMixin,
             if (visited and
                 review_request.public and
                 review_request.status == review_request.PENDING_REVIEW):
-                visited.timestamp = timezone.now()
+                visited.timestamp = django_timezone.now()
                 visited.save()
 
         return visited, last_visited
diff --git a/reviewboard/reviews/views/review_request_updates.py b/reviewboard/reviews/views/review_request_updates.py
index 33bf6e9f138e61d67a2ae9f7ef059e87dff553cf..37ddbfeca1d7da0b533ffacf765fa501a360a217 100644
--- a/reviewboard/reviews/views/review_request_updates.py
+++ b/reviewboard/reviews/views/review_request_updates.py
@@ -4,6 +4,7 @@ import io
 import json
 import logging
 import struct
+from datetime import timezone
 from typing import Optional
 
 import dateutil.parser
@@ -13,7 +14,7 @@ from django.http import (Http404,
                          HttpResponse,
                          HttpResponseBadRequest)
 from django.template.loader import render_to_string
-from django.utils.timezone import is_aware, make_aware, utc
+from django.utils.timezone import is_aware, make_aware
 from django.views.generic.base import ContextMixin, View
 from djblets.util.serializers import DjbletsJSONEncoder
 from djblets.views.generic.etag import ETagViewMixin
@@ -238,7 +239,7 @@ class ReviewRequestUpdatesView(ReviewRequestViewMixin, ETagViewMixin,
             since = dateutil.parser.parse(since)
 
             if not is_aware(since):
-                since = make_aware(since, utc)
+                since = make_aware(since, timezone.utc)
 
             entries = (
                 entry
diff --git a/reviewboard/scmtools/bzr/__init__.py b/reviewboard/scmtools/bzr/__init__.py
index ff2f2a842b5e6e709c95fd2402c0d0485336842b..dbdb2ee2022124a0f6392df7c543e456a28e1a28 100644
--- a/reviewboard/scmtools/bzr/__init__.py
+++ b/reviewboard/scmtools/bzr/__init__.py
@@ -2,10 +2,10 @@
 
 import os
 import urllib.parse
+from datetime import timezone
 
 import dateutil.parser
 from django.utils.encoding import force_str
-from django.utils.timezone import utc
 from djblets.util.filesystem import is_exe_in_path
 
 from reviewboard.scmtools.core import SCMClient, SCMTool, HEAD, PRE_CREATION
@@ -259,7 +259,8 @@ class BZRTool(SCMTool):
             # Attempt to parse this as a timestamp into a Bazaar date revision
             # specifier.
             try:
-                timestamp = dateutil.parser.parse(revision).astimezone(utc)
+                timestamp = dateutil.parser.parse(revision).astimezone(
+                    timezone.utc)
                 revspec = 'date:%s' % timestamp.strftime('%Y-%m-%d,%H:%M:%S')
             except ValueError:
                 revspec = None
diff --git a/reviewboard/testing/testcase.py b/reviewboard/testing/testcase.py
index 5872d853a67cab3d03eae34191e12c4700e6c4af..1383dae310b14f4eb5bd94762a15af8ebfd444de 100644
--- a/reviewboard/testing/testcase.py
+++ b/reviewboard/testing/testcase.py
@@ -6,7 +6,7 @@ import os
 import re
 import warnings
 from contextlib import contextmanager
-from datetime import datetime, timedelta
+from datetime import datetime, timedelta, timezone
 from typing import (Any, Callable, Dict, Iterator, List, Optional, Sequence,
                     TYPE_CHECKING, Tuple, Type, Union)
 from uuid import uuid4
@@ -21,7 +21,7 @@ from django.db.models import Q
 from django.http import HttpRequest, HttpResponse
 from django.test.client import RequestFactory
 from django.urls import ResolverMatch
-from django.utils import timezone
+from django.utils.timezone import now
 from djblets.registries.errors import AlreadyRegisteredError, ItemLookupError
 from djblets.secrets.token_generators import token_generator_registry
 from djblets.testing.testcases import (FixturesCompilerMixin,
@@ -877,7 +877,7 @@ class TestCase(FixturesCompilerMixin, DjbletsTestCase):
             repository = diffset.repository
 
         if author_date is None:
-            author_date = timezone.now()
+            author_date = now()
 
         if not committer_date and committer_name and committer_email:
             committer_date = author_date
@@ -2888,7 +2888,7 @@ class TestCase(FixturesCompilerMixin, DjbletsTestCase):
         return AccessToken.objects.create(
             application=application,
             token=generate_token(),
-            expires=timezone.now() + expires,
+            expires=now() + expires,
             scope=scope,
             user=user,
             **kwargs
diff --git a/reviewboard/webapi/tests/test_api_token.py b/reviewboard/webapi/tests/test_api_token.py
index d7dec42f02634aebf41519702f27b944892e3914..a28ce2807f25e95a1deaad22d76af19c1aa7e05c 100644
--- a/reviewboard/webapi/tests/test_api_token.py
+++ b/reviewboard/webapi/tests/test_api_token.py
@@ -1,6 +1,6 @@
-from datetime import datetime, timedelta
+from datetime import datetime, timedelta, timezone
 
-from django.utils import timezone
+from django.utils import timezone as django_timezone
 from djblets.db.query import get_object_or_none
 from djblets.webapi.errors import (INVALID_FORM_DATA,
                                    PERMISSION_DENIED)
@@ -204,7 +204,7 @@ class ResourceListTests(SpyAgency, ExtraDataListMixin, BaseWebAPITestCase,
         """
         expires = datetime(
             2022, 9, 20, 13, 42, 0,
-            tzinfo=timezone.get_fixed_timezone(timedelta(hours=5)))
+            tzinfo=django_timezone.get_fixed_timezone(timedelta(hours=5)))
         utc_expires = '2022-09-20T08:42:00+00:00'
 
         token_data = self.token_data.copy()
@@ -432,7 +432,7 @@ class ResourceItemTests(ExtraDataItemMixin, BaseWebAPITestCase,
 
         expires = datetime(
             2022, 9, 20, 13, 42, 0,
-            tzinfo=timezone.get_fixed_timezone(timedelta(hours=5)))
+            tzinfo=django_timezone.get_fixed_timezone(timedelta(hours=5)))
         utc_expires = '2022-09-20T08:42:00+00:00'
 
         token_data = self.token_data.copy()
diff --git a/reviewboard/webapi/tests/test_review.py b/reviewboard/webapi/tests/test_review.py
index 272f6b6688d4b5dbdef515437c243cb23ef81bca..77a8b706ee28f5e2e57534f863ca34352adca98b 100644
--- a/reviewboard/webapi/tests/test_review.py
+++ b/reviewboard/webapi/tests/test_review.py
@@ -1,7 +1,7 @@
-from datetime import datetime, timedelta
+from datetime import datetime, timedelta, timezone
 
 from django.core import mail
-from django.utils import timezone
+from django.utils import timezone as django_timezone
 from djblets.util.dates import get_tz_aware_utcnow
 from djblets.testing.decorators import add_fixtures
 from djblets.webapi.errors import (DOES_NOT_EXIST, INVALID_FORM_DATA,
@@ -402,16 +402,17 @@ class ResourceItemTests(SpyAgency, ReviewItemMixin,
         # Unfortunately, we cannot spy on datetime.utcnow since it is a
         # builtin. So we replace get_tz_aware_utcnow with timezone.now and we
         # will replace that with a constant function in the spy_on calls below.
-        self.spy_on(get_tz_aware_utcnow, call_fake=lambda: timezone.now())
+        self.spy_on(get_tz_aware_utcnow,
+                    call_fake=lambda: django_timezone.now())
         creation_timestamp = datetime.fromtimestamp(0, timezone.utc)
         review_timestamp = creation_timestamp + timedelta(hours=1)
         revoke_timestamp = review_timestamp + timedelta(hours=1)
 
-        with spy_on(timezone.now, call_fake=lambda: creation_timestamp):
+        with spy_on(django_timezone.now, call_fake=lambda: creation_timestamp):
             review_request = self.create_review_request(publish=True,
                                                         submitter=self.user)
 
-        with spy_on(timezone.now, call_fake=lambda: review_timestamp):
+        with spy_on(django_timezone.now, call_fake=lambda: review_timestamp):
             review = self.create_review(review_request,
                                         body_top=Review.SHIP_IT_TEXT,
                                         ship_it=True,
@@ -424,7 +425,7 @@ class ResourceItemTests(SpyAgency, ReviewItemMixin,
         self.assertEqual(review_request.last_updated, review_timestamp)
         self.assertEqual(review.timestamp, review_timestamp)
 
-        with spy_on(timezone.now, call_fake=lambda: revoke_timestamp):
+        with spy_on(django_timezone.now, call_fake=lambda: revoke_timestamp):
             rsp = self.api_put(
                 get_review_item_url(review_request, review.pk),
                 {'ship_it': False},
