2016-01-08 32 views
1

有了这个我现在挣扎了几个小时。代码比我在这里提供的例子大得多,但它分解为:错误的时区? 30分钟,而不是1小时

我有一个天真的日期时间对象,我想将它转换为UTC时间,但那不起作用预期。

import datetime 
import pytz 

# Following is a naive datetime object, but we know the user meant 
# timezone Europe/Zurich 

zurich = datetime.datetime(2016, 1, 8, 7, 10) 
# datetime.datetime(2016, 1, 8, 7, 10) 

# So I'm now converting it to a datetime object which is aware of the 
# timezone 

zurich = zurich.replace(tzinfo=pytz.timezone('Europe/Zurich')) 
# datetime.datetime(2016, 1, 8, 7, 10, tzinfo=<DstTzInfo 'Europe/Zurich' BMT+0:30:00 STD>) 

# Let's convert to UTC 

zurich = zurich.astimezone(pytz.utc) 
# datetime.datetime(2016, 1, 8, 6, 40, tzinfo=<UTC>) 

与UTC时间相比,苏黎世的偏移量为+01:00(夏令时)或+02:00(夏令时)。为什么Python认为它是+00:30?

任何帮助高度赞赏(我已经开始拔出我的头发了)。

+0

在这里的文档发现:HTTP://pytz.sourceforge .net /#example-usage](http://pytz.sourceforge.net/#example-usage) 不幸的是,对于许多时区,使用标准datetime构造函数的tzinfo参数''不适用于pytz。 – Daniel

+0

它不能工作,甚至语法也不够,因为如果一个时区大陆/城市处于DST时间或STD时间,则不能在没有知识的情况下盲目更换时区。因此,必须调用pytz的智能函数来获取时间和区域,应用当前的政府规则并将区域定制为“CET + 1:00 STD”或“CEST + 2:00 DST”。标准的日期时间方法没有回调到tzinfo来定制它,并且甚至必须在从DST到STD的点改变之前和之后一小时使用'is_dst' pameter,以便明确地转换时间。 – hynekcer

回答

0

我发现了一个类似的问题this答案,如果我重写代码这种其他的方式,它似乎处理您的请求

import datetime 
import pytz 
zurich = pytz.timezone('Europe/Zurich').localize(datetime.datetime(2016,1,8,7,10), is_dst=None) 
zurich = zurich.astimezone(pytz.utc) 
# datetime.datetime(2016, 1, 8, 6, 10, tzinfo=<UTC>) 
相关问题