Django 1.4 timezone.now() vs datetime.datetime.now()
Я немного смущен обработкой летнего времени
settings.py:
TIME_ZONE = 'Europe/London'
USE_TZ = True
в оболочке django:
>>> from django.utils import timezone
>>> import datetime
>>> print timezone.now()
2012-05-28 11:19:42.897000+00:00
>>> print timezone.make_aware(datetime.datetime.now(),timezone.get_default_timez
one())
2012-05-28 12:20:03.224000+01:00
почему они не совпадают с летней экономией? Оба должны знать локали, не?
Я читал документы, но я не мудрее.
Ответы
Ответ 1
Согласно источнику timezone.now()
:
def now():
"""
Returns an aware or naive datetime.datetime, depending on settings.USE_TZ.
"""
if settings.USE_TZ:
# timeit shows that datetime.now(tz=utc) is 24% slower
return datetime.utcnow().replace(tzinfo=utc)
else:
return datetime.now()
Он основан на utc
вместо вашего часового пояса по умолчанию. Вы можете достичь того же значения, используя
now = timezone.make_aware(datetime.datetime.now(),timezone.get_default_timezone())
print now.astimezone(timezone.utc)
Ответ 2
Начиная с Django 1.11 вы можете просто вызвать django.utils.timezone.localtime
для получения datetime
для вашего часового пояса по умолчанию.
>>> from django.utils import timezone
>>> timezone.localtime()
Из документов:
Преобразует значащее время и время в другой часовой пояс, по умолчанию - текущий часовой пояс.
Когда значение опущено, по умолчанию оно используется now()
.
Эта функция не работает с наивными датами; вместо этого используйте make_aware()
.
Ответ 3
from datetime import datetime
from django.utils import timezone
def now():
try:
return timezone.localtime(timezone.now()).strftime('%Y-%m-%dT%H:%M:%S')
except Exception as exp:
print('TimeZone is not set - {}'.format(exp))
return datetime.now().strftime('%Y-%m-%dT%H:%M:%S')
Если вы установите TIME_ZONE = 'Europe/London'
и USE_TZ = True
в настройке Django, вы поместите в раздел try
а в разделе "За except
".
[ ПРИМЕЧАНИЕ ]:
-
.strftime()
является опцией - Они тестировались на
Python 2.7
и Django 1.11