2012-05-30 14 views
6

Esto podría ser una pregunta un poco trivial, pero ¿no puedo obtener django ahora() para estar en el huso horario definido en settings.TIME_ZONE?¿No se supone que django now() se encuentra en la zona horaria predeterminada?

Esto es lo que realmente está sucediendo:

>>> from django.utils import timezone 
>>> timezone.now() 
datetime.datetime(2012, 5, 30, 16, 30, 0, 782087, tzinfo=<UTC>) 
>>> timezone.get_default_timezone() 
<DstTzInfo 'Asia/Singapore' SMT+6:55:00 STD> 
+0

Apuesto a que 'timezone.get_current_timezone() 'también es' Asia/Singapore '. Solo para completar la imagen. – Peterino

Respuesta

1

O podría leer la fuente:

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

respuesta es No, me tienen que ajustar a mí mismo.

0

Depende

ahora() Devuelve una fecha y hora conscientes o ingenuos que representa el punto actual en el tiempo cuando USE_TZ es verdadera o falsa, respectivamente .

https://docs.djangoproject.com/en/dev/ref/utils/#django-utils-timezone

Así que todo indicaría que USE_TZ es falsa en su caso, y no es tomar el TZ en consideración.

+0

Se refieren a las fechas de la zona horaria y no a las de la zona horaria. La redacción parecía implicar que estarían en la zona horaria * correcta *, pero aparentemente no. –

+0

Sí, llegué a esa conclusión leyendo el documento a la luz de su ejemplo. Probablemente hubiera esperado que usara el TZ predeterminado de todos modos. – pcalcao

+1

Esto (generalmente) no tiene nada que ver con 'USE_TZ'. 'timezone.now()' * always * devuelve la hora UTC. Si desea la hora local, necesita convertir la * presentación * usando 'timezone.localtime()'. Tenga en cuenta que el tiempo permanecerá igual al de su objeto 'datetime', la hora de presentación * y * la zona horaria cambiará simultáneamente. Pruebe una comparación: '' 't = timezone.now(); t == timezone.localtime (t) '' ' – Peterino

9

de Django source code (como aparece en la respuesta elegida) explica el concepto de timezone.now(): (en su zona horaria activa)

  1. datetime.now() se obtiene la hora actual sin información de zona horaria ("fecha y hora ingenua"), mientras que. ..
  2. timezone.now() siempre se obtiene la hora actual en GMT (!) con información de zona horaria.

Esto es irritante a primera vista, sí. Podrían haber decidido dar la hora actual de la zona horaria activa, pero no lo hicieron. Puede seguir utilizando timezone.localtime(timezone.now()) para conseguir lo que quiere:

from django.utils import timezone 
from datetime import datetime 

timezone.get_current_timezone() 
# <DstTzInfo 'Antarctica/McMurdo' LMT+11:39:00 STD> 
datetime.now() 
# datetime.datetime(2014, 8, 19, 20, 8, 8, 440959) 
timezone.localtime(timezone.now()) 
# datetime.datetime(2014, 8, 19, 20, 8, 14, 889429, tzinfo=<DstTzInfo 'Antarctica/McMurdo' NZST+12:00:00 STD>) 
timezone.now() 
# datetime.datetime(2014, 8, 19, 8, 8, 22, 273529, tzinfo=<UTC>) 
datetime.utcnow() 
# datetime.datetime(2014, 8, 19, 8, 8, 29, 769312) 

Para los recién llegados y los usuarios normales timezone.localtime(timezone.now()) es probablemente el más intuitivo. Una hora local que aún conserva información de zona horaria.

Cuestiones relacionadas