2012-05-30 8 views
6

Questa potrebbe essere una domanda banale, ma non riesco a ottenere django now() nel fuso orario definito in settings.TIME_ZONE?Non è ora django() dovrebbe essere nel fuso orario predefinito?

Questo è ciò che sta realmente accadendo:

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

Scommetto che "timezone.get_current_timezone()" è anche "Asia/Singapore". Solo per rendere l'immagine completa. – Peterino

risposta

1

O potrei appena letto la fonte:

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

risposta è no, devo regolarlo me stesso.

0

Dipende

ora() Restituisce un datetime consapevoli o ingenuo che rappresenta il punto corrente nel momento in cui USE_TZ è, rispettivamente, Vero o Falso .

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

Quindi tutto indicherebbe che USE_TZ è falso nel tuo caso, e non è di prendere il TZ in considerazione.

+0

Significa solo date sensibili al fuso orario e non alle date sensibili al fuso orario. La formulazione sembrava implicare che sarebbero nel * fuso orario giusto *, ma apparentemente no. –

+0

Sì, sono arrivato a questa conclusione leggendo il documento alla luce del tuo esempio. Probabilmente mi sarei aspettato che usasse comunque il TZ predefinito. – pcalcao

+1

Questo (in genere) non ha nulla a che fare con 'USE_TZ'. 'timezone.now()' * sempre * restituisce l'ora UTC. Se vuoi l'ora locale devi convertire la * presentazione * usando 'timezone.localtime()'. Si noti che il tempo rimarrà lo stesso dell'oggetto 'datetime', la presentazione dell'ora * e * il fuso orario cambieranno simultaneamente. Prova un confronto: '' 't = timezone.now(); t == timezone.localtime (t) '' ' – Peterino

9

di Django source code (come visualizzato nella risposta scelta) spiega il concetto di timezone.now(): (! Nel tuo fuso orario attiva)

  1. datetime.now() cede il tempo corrente senza informazioni fuso orario ("datetime naive"), mentre. ..
  2. timezone.now()sempre produce il ora corrente a UTC (!) con informazioni sul fuso orario.

Questo è irritante a prima vista, sì. Avrebbero potuto decidere di fornire l'ora corrente del fuso orario attivo, ma non l'hanno fatto. È comunque possibile utilizzare timezone.localtime(timezone.now()) per ottenere ciò che si vuole:

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) 

Per i nuovi arrivati ​​e gli utenti ordinari timezone.localtime(timezone.now()) è probabilmente il più intuitivo. Un'ora locale che conserva ancora le informazioni sul fuso orario.

Problemi correlati