2013-08-30 14 views
20

Sto provando a convertire l'oggetto datetime con fuso orario in UTC e quindi nel fuso orario originale. Ho un seguente frammentoconversione timetime e timezone con comportamento pytz-mind blowing

t = datetime(
    2013, 11, 22, hour=11, minute=0, 
    tzinfo=pytz.timezone('Europe/Warsaw') 
) 

ora in ipython:

In [18]: t 
Out[18]: datetime.datetime(
    2013, 11, 22, 11, 0, tzinfo=<DstTzInfo 'Europe/Warsaw' WMT+1:24:00 STD> 
) 

e ora cerchiamo di fare la conversione in UTC e ritorno. Mi aspetto di avere la stessa rappresentazione come:

In [19]: t.astimezone(pytz.utc).astimezone(pytz.timezone('Europe/Warsaw')) 
Out[19]: datetime.datetime(
    2013, 11, 22, 10, 36, tzinfo=<DstTzInfo 'Europe/Warsaw' CET+1:00:00 STD> 
) 

Eppure vediamo che Out[18] e Out[19] differiscono. Cosa sta succedendo?

+1

negozi Django datetimes banca dati ingenuo saggio. Se gestisci il caso, dai un'occhiata qui per convertire le date nel fuso orario di cui hai bisogno: https://docs.djangoproject.com/en/dev/topics/i18n/timezones/#usage – Jingo

+0

se Django memorizza ingenue datetimes di no controllato dall'impostazione 'USE_TZ'. Se questo è 'Vero', Django tratta i tempi in forme ecc. Come nel [fuso orario corrente] (https://docs.djangoproject.com/en/dev/topics/i18n/timezones/#selecting-the-corrent-time -zona) e li memorizza nel db convertito in UTC. – Anentropic

risposta

44

La documentazione http://pytz.sourceforge.net/ afferma "Sfortunatamente l'utilizzo dell'argomento tzinfo dei costruttori datetime standard" non funziona "con pytz per molti fusi orari." Il codice

t = datetime(
    2013, 5, 11, hour=11, minute=0, 
    tzinfo=pytz.timezone('Europe/Warsaw') 
) 

non funziona in base a questo, invece si dovrebbe utilizzare il metodo di localizzare:

t = pytz.timezone('Europe/Warsaw').localize(
     datetime(2013, 5, 11, hour=11, minute=0)) 
+0

Molto buono a sapersi. – dgel

+0

Qualche idea su quale sia la ragione? – yakxxx

+18

Il modulo datetime Python presuppone che un oggetto del fuso orario abbia un offset UTC costante. Gli oggetti del fuso orario Pytz hanno offset UTC variabili (perché i tempi di risparmio di luce del giorno e quelli storici cambiano). Quando usi pytz's localize() può raccogliere l'offset corretto per quella data specifica. Quando si utilizza la sostituzione di datetime (tzinfo ==) si finisce con il più vecchio offset UTC per quel fuso orario nel database. –