web-dev-qa-db-fra.com

django 1.4 timezone.now () vs datetime.datetime.now ()

Je suis un peu confus par le traitement de l'heure avancée

settings.py:

TIME_ZONE = 'Europe/London'
USE_TZ = True

dans le shell 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

pourquoi ne sont-ils pas les mêmes en ce qui concerne l'heure avancée? Les deux devraient être sensibles à la localisation, non?

J'ai lu la documentation mais je ne suis pas plus sage.

42
meepmeep

Selon timezone.now()source :

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()

Il est basé sur utc au lieu de votre fuseau horaire par défaut. Vous pouvez obtenir la même valeur en utilisant

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

Depuis Django 1.11, vous pouvez simplement appeler Django.utils.timezone.localtime pour récupérer datetime pour votre fuseau horaire par défaut. 

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

De docs:

Convertit une date et heure consciente en un fuseau horaire différent, par défaut le fuseau horaire actuel.

Lorsque la valeur est omise, la valeur par défaut est now() .

Cette fonction ne fonctionne pas sur les datetime naïfs; utilisez make_aware() à la place.

8
vishes_shell
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')

Si vous définissez TIME_ZONE = 'Europe/London' et USE_TZ = True dans les paramètres Django, vous les placerez dans la section try et dans la section except


[REMARQUE]: 

  • .strftime() est une option
  • Ceux-ci testés sur Python 2.7 et Django 1.11
0
Benyamin Jafari