[2.1.x] Fixed #29514 -- Reverted "Used datetime.timezone.utc instead of pytz.utc for better performance."

This reverts commit 27ca5ce19f due to a
regression.

Backport of 2ec151e35d from master
This commit is contained in:
Tim Graham 2018-06-28 09:26:41 -04:00
parent 1084bcc4b7
commit 3a6040246f
5 changed files with 20 additions and 10 deletions

View File

@ -59,7 +59,10 @@ class SessionStore(SessionBase):
Return the modification time of the file storing the session's content. Return the modification time of the file storing the session's content.
""" """
modification = os.stat(self._key_to_file()).st_mtime modification = os.stat(self._key_to_file()).st_mtime
return datetime.datetime.fromtimestamp(modification, timezone.utc if settings.USE_TZ else None) if settings.USE_TZ:
modification = datetime.datetime.utcfromtimestamp(modification)
return modification.replace(tzinfo=timezone.utc)
return datetime.datetime.fromtimestamp(modification)
def _expiry_date(self, session_data): def _expiry_date(self, session_data):
""" """

View File

@ -336,7 +336,11 @@ class FileSystemStorage(Storage):
If timezone support is enabled, make an aware datetime object in UTC; If timezone support is enabled, make an aware datetime object in UTC;
otherwise make a naive one in the local timezone. otherwise make a naive one in the local timezone.
""" """
return datetime.fromtimestamp(ts, timezone.utc if settings.USE_TZ else None) if settings.USE_TZ:
# Safe to use .replace() because UTC doesn't have DST
return datetime.utcfromtimestamp(ts).replace(tzinfo=timezone.utc)
else:
return datetime.fromtimestamp(ts)
def get_accessed_time(self, name): def get_accessed_time(self, name):
return self._datetime_from_timestamp(os.path.getatime(self.path(name))) return self._datetime_from_timestamp(os.path.getatime(self.path(name)))

View File

@ -50,7 +50,7 @@ class DatetimeSerializer(BaseSerializer):
def serialize(self): def serialize(self):
if self.value.tzinfo is not None and self.value.tzinfo != utc: if self.value.tzinfo is not None and self.value.tzinfo != utc:
self.value = self.value.astimezone(utc) self.value = self.value.astimezone(utc)
value_repr = repr(self.value).replace("datetime.timezone(datetime.timedelta(0), 'UTC')", 'utc') value_repr = repr(self.value).replace("<UTC>", "utc")
if isinstance(self.value, datetime_safe.datetime): if isinstance(self.value, datetime_safe.datetime):
value_repr = "datetime.%s" % value_repr value_repr = "datetime.%s" % value_repr
imports = ["import datetime"] imports = ["import datetime"]

View File

@ -173,7 +173,8 @@ class SyndicationFeed:
if latest_date is None or item_date > latest_date: if latest_date is None or item_date > latest_date:
latest_date = item_date latest_date = item_date
return latest_date or datetime.datetime.now(utc) # datetime.now(tz=utc) is slower, as documented in django.utils.timezone.now
return latest_date or datetime.datetime.utcnow().replace(tzinfo=utc)
class Enclosure: class Enclosure:

View File

@ -2,10 +2,9 @@
Timezone-related classes and functions. Timezone-related classes and functions.
""" """
import datetime
import functools import functools
from contextlib import ContextDecorator from contextlib import ContextDecorator
from datetime import timedelta, tzinfo from datetime import datetime, timedelta, tzinfo
from threading import local from threading import local
import pytz import pytz
@ -53,8 +52,7 @@ class FixedOffset(tzinfo):
# UTC time zone as a tzinfo instance. # UTC time zone as a tzinfo instance.
# (Use utc = datetime.timezone.utc here when PY35 isn't supported.) utc = pytz.utc
utc = datetime.timezone(ZERO, 'UTC')
def get_fixed_timezone(offset): def get_fixed_timezone(offset):
@ -174,7 +172,7 @@ def template_localtime(value, use_tz=None):
This function is designed for use by the template engine. This function is designed for use by the template engine.
""" """
should_convert = ( should_convert = (
isinstance(value, datetime.datetime) and isinstance(value, datetime) and
(settings.USE_TZ if use_tz is None else use_tz) and (settings.USE_TZ if use_tz is None else use_tz) and
not is_naive(value) and not is_naive(value) and
getattr(value, 'convert_to_local_time', True) getattr(value, 'convert_to_local_time', True)
@ -221,7 +219,11 @@ def now():
""" """
Return an aware or naive datetime.datetime, depending on settings.USE_TZ. Return an aware or naive datetime.datetime, depending on settings.USE_TZ.
""" """
return datetime.datetime.now(utc if settings.USE_TZ else None) if settings.USE_TZ:
# timeit shows that datetime.now(tz=utc) is 24% slower
return datetime.utcnow().replace(tzinfo=utc)
else:
return datetime.now()
# By design, these four functions don't perform any checks on their arguments. # By design, these four functions don't perform any checks on their arguments.