2012-05-28 18 views
27

estoy un poco confundido por los cambios de horario manipulacióndjango 1.4 timezone.now() vs datetime.datetime.now()

settings.py:

TIME_ZONE = 'Europe/London' 
USE_TZ = True 

en la cáscara 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 qué no son lo mismo con respecto a la luz del día? Ambos deben ser conscientes de la configuración regional, ¿no?

He leído los documentos pero no soy más sabio.

Respuesta

43

Según 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() 

Se basa en utc en lugar de su zona horaria por defecto. Puede obtener el mismo valor usando

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

que es un poco contrario a la intuición. ¡Había asumido que timezone.now() me habría dado ahora en la zona horaria predeterminada! No es muy pitónico en mi opinión. El uso de .astimezone() ha solucionado mi problema, gracias. – meepmeep

+0

¿Por qué sigo recibiendo un error cuando hago lo siguiente: >>> import datetime >>> desde la zona horaria de importación de django.utils >>> desde la importación de polls.models Pregunta >>> # crea una instancia de Question con pub_date 30 días en el futuro >>> future_question = Pregunta (pub_date = timezone.now() + datetime.timedelta (days = 30)) >>> # ¿se publicó recientemente? >>> future_question.was_published_recently() verdadera – pitchblack408

+0

>>> future_question.was_published_recently() Rastreo (llamada más reciente pasado): Archivo "", línea 1, en archivo "C: \ Users \ michmar3 \ workspace \ pollsite \ polls \ models.py ", línea 17, en was_p ublished_recently return self.pub_date> = datetime.datetime.now() - datetime.timedelta (days = 1) Archivo" C: \ jython2. 7b2 \ Lib \ datetime.py ", línea 1727, en __ge__ return self .__ cmp (otro)> = 0 Archivo" C: \ jython2.7b2 \ Lib \ datetime.py ", línea 1765, en _datetime__cmp raise TypeError ("No puedo comparar ingenuo y datetimes conscientes ") TypeError: no se puede comparar fechas de programación ingenuas y conscientes – pitchblack408