2012-05-28 12 views
27

Sono un po 'confuso dal risparmio di luce del giorno la gestionedjango 1.4 timezone.now (vs) datetime.datetime.now()

settings.py:

TIME_ZONE = 'Europe/London' 
USE_TZ = True 

nella 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 

perché non sono gli stessi rispetto all'ora legale? Entrambi dovrebbero essere localizzati, no?

Ho letto i documenti ma non ne sono il più saggio.

risposta

43

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

Si basa sulla utc al posto del tuo fuso orario predefinito. È possibile ottenere lo stesso valore utilizzando

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

che è alquanto controintuitivo. Avevo pensato che timezone.now() mi avrebbe dato ora nel fuso orario predefinito! Non molto pitone secondo me. L'uso di .astimezone() ha risolto il problema, grazie. – meepmeep

+0

Perché continuo a ricevere un errore quando faccio quanto segue: >>> importa datetime >>> dal fuso orario di importazione di django.utils >>> da polls.models import Domanda >>> # crea un'istanza di domanda con pub_date 30 giorni in futuro >>> future_question = Domanda (pub_date = timezone.now() + datetime.timedelta (giorni = 30)) >>> # è stato pubblicato di recente? >>> future_question.was_published_recently() vero – pitchblack408

+0

>>> future_question.was_published_recently() Traceback (chiamata più recente scorso): file "", linea 1, in file "C: \ Users \ michmar3 \ workspace \ pollsite \ polls \ models.py ", riga 17, in was_p ublished_recently return self.pub_date> = datetime.datetime.now() - datetime.timedelta (days = 1) File" C: \ jython2. 7b2 \ Lib \ datetime.py ", riga 1727, in __ge__ return self .__ cmp (altro)> = 0 File" C: \ jython2.7b2 \ Lib \ datetime.py ", riga 1765, in _datetime__cmp raise TypeError ("non posso confrontare l'ingenuo e dati personali ") TipoErrore: impossibile confrontare tempi di trasmissione dati ingenui e consapevoli – pitchblack408