2012-09-27 33 views
35

我有一個日期,我需要使它感知時區。pytz和astimezone()不能應用到天真的日期時間

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) 

我需要找到,如果這是真的:

print start_date>local_now 

但我得到這個錯誤。

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

我把utc轉換成東京沒有問題。我需要在東京熟悉start_date時區的廣告。

由於

回答

34

對於pytz時區,使用其.localize()方法把一個幼稚datetime對象到一個與一個時區:

start_date = local_tz.localize(start_date) 

對於時區沒有DST過渡,所述.replace() method到一個時區附加到天真datetime對象通常還應該工作:

start_date = start_date.replace(tzinfo=local_tz) 

請參閱pytz文檔的localized times and date arithmetic以獲取更多詳細信息。

+6

[pytz docs](http://pytz.sourceforge.net/)說,使用tzinfo屬性直接失敗了許多時區。應該使用tz.localize()來代替。 – jfs

+0

@JFSebastian作爲一個很好的例子,它可以如何嚴重失敗看到http://stackoverflow.com/questions/11442183/pytz-timezone-shows-weird-results-for-asia-calcutta並注意到它沒有任何關係與DST。 –

+0

@ J.F.Sebastian:有趣。更新了答案。 –

11

您可以使用local_tz.localize(naive_dt, is_dst=None)將天真的日期時間對象轉換爲時區感知的對象。

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力.localize()如果給定的本地時間不明確引發異常。

相關問題