/ / django 1.4 timezone.now () vs datetime.datetime.now () - django, fuso horário

django 1.4 timezone.now () vs datetime.datetime.now () - django, fuso horário

Estou um pouco confuso com o manuseio da economia de luz do dia

settings.py:

TIME_ZONE = "Europe/London"
USE_TZ = True

no shell do 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

Por que eles não são iguais em relação ao horário de verão? Ambos devem estar cientes do local, não?

Eu li os documentos, mas não sou o mais sábio.

Respostas:

54 para resposta № 1

De acordo com 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()

É baseado em utc em vez do seu fuso horário padrão. Você poderia conseguir o mesmo valor usando

now = timezone.make_aware(datetime.datetime.now(),timezone.get_default_timezone())
print now.astimezone(timezone.utc)

5 para resposta № 2

Desde o Django 1.11 você pode simplesmente ligar django.utils.timezone.localtime buscar datetime para o fuso horário padrão.

>>> from django.utils import timezone
>>> timezone.localtime()

De docs:

Converte um datetime com reconhecimento em um fuso horário diferente, por padrão, o fuso horário atual.

Quando o valor é omitido, o padrão é now().

Esta função não funciona em tempos de dados ingênuos; usar make_aware() em vez de.


0 para resposta № 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")

Se você definir TIME_ZONE = "Europe/London" e USE_TZ = True na configuração do Django, você colocará no try seção e mais, no except seção.


[NOTA]:

  • .strftime() é uma opção
  • Estes testados em Python 2.7 e Django 1.11