2013-03-13 94 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