2012-09-27 11 views
35

Ho una data e ho bisogno di renderlo noto al fuso orario.pytz e astimezone() non possono essere applicati a un datetime ingenuo

local_tz = timezone('Asia/Tokyo') 
start_date = '2012-09-27' 
start_date = datetime.strptime(start_date, "%Y-%m-%d") 
start_date = start_date.astimezone(local_tz) 


now_utc = datetime.now(timezone('UTC')) 
local_now = now_utc.astimezone(local_tz) 

Ho bisogno di trovare se questo è vero:

print start_date>local_now 

Ma ottengo questo errore.

start_date = start_date.astimezone(local_tz) 
    ValueError: astimezone() cannot be applied to a naive datetime 

Converto utc in tokyo senza problemi. Devo rendere bene l'annuncio start_date timezone well in tokyo.

Grazie

risposta

34

Per pytz fusi orari, usa il metodo .localize() trasformare un datetime oggetto naive in uno con un fuso orario:

start_date = local_tz.localize(start_date) 

Per timezones senza transizione DST, il .replace() method di allegare un fuso orario per un datetime oggetto naif dovrebbe normalmente funzionare anche:

start_date = start_date.replace(tzinfo=local_tz) 

Vedere lo localized times and date arithmetic della documentazione di pytz per ulteriori dettagli.

+6

[pytz docs] (http://pytz.sourceforge.net/) afferma che l'uso dell'attributo tzinfo fallisce direttamente per molti fusi orari. tz.localize() dovrebbe invece essere usato. – jfs

+0

@JFSebastian per un buon esempio di come può fallire vedere http://stackoverflow.com/questions/11442183/pytz-timezone-shows-weird-results-for-asia-calcutta e notare che non ha nulla da fare con DST. –

+0

@ J.F.Sebastian: interessante. Aggiornata la risposta. –

11

È possibile utilizzare local_tz.localize(naive_dt, is_dst=None) per convertire un oggetto datetime ingenuo in uno a rilevamento del fuso orario.

from datetime import datetime 
import pytz 

local_tz = pytz.timezone('Asia/Tokyo') 

start_date = local_tz.localize(datetime(2012, 9, 27), is_dst=None) 
now_utc = datetime.utcnow().replace(tzinfo=pytz.utc) 

print start_date > now_utc 

is_dst=None forze .localize() per sollevare un'eccezione se dato ora locale è ambigua.

Problemi correlati