2013-03-13 92 views
1

我有一個python TZ-aware datetime end_date,比如2013-03-01 06:00:00 + 00:00。我希望得到美國/芝加哥時區這個日期時間的月份。如果我做end_date.month我得到3.我想做一個方法調用像end_date.timezone('America/Chicago').month - 或什麼 - 這會給我正確的價值2.Python本地日期時間月

想我明白這個datetime/pytz的東西..

+1

難道不是像'pytz.timezone('America/Chicago').localize(end_date).month'? – voithos 2013-03-13 22:39:41

+0

不錯的嘗試,但這給:ValueError:不是天真的日期時間(tzinfo已設置) – Erik 2013-03-13 22:44:06

+1

我猜''end_date.astimezone(pytz.timezone('America/Chicago'))。month'?對, – voithos 2013-03-13 22:52:13

回答

4

你可以使用.astimezone()(並根據文檔,處理時區轉換和夏令時等事情,你應該得到.normalize()的結果)。

from pytz import timezone 
end_date = ...tz-aware datetime... 
us_tz = timezone('America/Chicago') 

localized_end_date = us_tz.normalize(end_date.astimezone(us_tz)) 

注意.astimezone不能用天真的日期時間使用 - 它必須是一個TZ感知日期時間。另一種方法是在tzinfo實例上使用.localize()方法。

end_date = ...naive datetime... 
localized_end_date = timezone('America/Chicago').localize(end_date, is_dst=None) 
+0

@ J.F.Sebastian:正確 - 謝謝你指出。我已經相應地更新了答案。 – voithos 2013-03-16 16:08:34

+1

如果你想爲模棱兩可的天真日期引發異常,而不是可能不正確(50%)'is_dst = True'或'is_dst = False',則設置'is_dst = None'。雖然如果只有'.month'很有趣,那麼最好抑制這個異常。 – jfs 2013-03-17 01:11:57