2012-11-12 11 views
8

Ho un database che memorizza datetime come UTC. Devo cercare informazioni da un momento particolare, ma la data e l'ora sono date in un'ora locale, diciamo "Europa/Copenhagen". Mi sono dato come questi:Python pytz: converti ora locale in utc. La localizzazione non sembra convertire

year = 2012; month = 12; day = 2; hour = 13; min = 1; 

Così, ho bisogno di convertire queste a UTC modo che io possa cercare nel database. Voglio farlo usando pytz. Io sto guardando localize:

local_tz = timezone('Europe/Copenhagen') 
t = local_tz.localize(datetime.datetime(year, month, day, hour, min)) 

Ma io sono confuso su localize(). Questo presupponendo che quell'anno, ecc., Mi venga dato in ora locale? Oppure, supponendo che siano dati in UTC e ora li ha convertiti all'ora locale?

print t mi da:

2012-12-02 13:01:00+01:00 

Così sembra che si presume che l'anno originale, ecc era in UTC; ora è ora 13 + 1 invece di 13. Quindi cosa dovrei fare invece? Ho letto la documentazione di pytz e questo non mi rende più chiaro. Ricorda molto che le cose sono complicate quindi non sono sicuro che pytz stia effettivamente risolvendo questi problemi. E, non sempre so se gli esempi mi mostrano cose che funzionano o cose che non funzionano.

ho cercato normalizzare:

print local_tz.normalize(t) 

che mi dà lo stesso risultato della stampa t.

MODIFICA: con i numeri sopra indicati per anno ecc. Dovrebbe corrispondere con le informazioni nel database 2012-12-2 12:01. (Dopo Copenaghen è UTC + 1 in quella data)

risposta

16

localize() attribuisce il fuso orario da un naif datetime.datetime esempio nel locale fuso orario .

Se si dispone di valori datetime in un fuso orario locale, localizzare a quel fuso orario, quindi utilizzare .astimezone() per il cast del valore a UTC:

>>> localdt = local_tz.localize(datetime.datetime(year, month, day, hour, min)) 
>>> localdt.astimezone(pytz.UTC) 
datetime.datetime(2012, 12, 2, 12, 1, tzinfo=<UTC>) 

Nota che non necessità per fare questo, datetime oggetti con un fuso orario possono essere confrontati; faranno entrambi essere normalizzati a UTC per il test:

>>> localdt.astimezone(pytz.UTC) == localdt 
True 
+0

Che dà l'ora come 14: 01: 00 + 01: 00. L'ora locale corretta è 13 e l'ora utc è 12. – user984003

+0

@ user984003: Ah, scusa, ho letto male la prima frase. '.astimezone()' è ancora la strada da percorrere, solo il contrario. –

+0

Sì, quella seconda strada funziona, grazie. Potresti averlo nella tua risposta, altrimenti penso che sia un po 'confuso;) Vedo che ero confuso riguardo alla data stampata. "+01: 00" mi dice che è un'ora avanti a utc, non che dovrei aggiungere un'ora al tempo. – user984003

0

Se si conosce la rappresentazione tempo in arrivo è nel fuso orario Europe/Copenhagen, è possibile creare come fuso orario-aware per cominciare:

local_tz = timezone('Europe/Copenhagen') 
t = local_tz.localize(datetime.datetime(year, month, day, hour, min)) 

È quindi possibile "convertire" questo per UTC con:

t_utc = t.astimezone(pytz.UTC) 

, ma questo potrebbe non essere necessario, a seconda di come sano di mente i driver di database sono. t e t_utc rappresentano lo stesso punto-in-time e il codice funzionante dovrebbe trattarli in modo intercambiabile. La tupla (year, month, day, hour, minute, second, …) è semplicemente una rappresentazione leggibile da parte dell'utente di questo point-in-time in un determinato fuso orario e sistema di calendario.

Problemi correlati