我在欧洲工作,我有一系列的日期时间如下:
datetime(2016,10,30,0,0,0)
datetime(2016,10,30,1,0,0)
datetime(2016,10,30,2,0,0)
datetime(2016,10,30,2,0,0)
datetime(2016,10,30,3,0,0)
datetime(2016,10,30,4,0,0)
datetime(2016,10,30,5,0,0)
等一整天。我想将它们转换为UTC日期时间,最终应该看起来像这样:
2016-10-30 00:00:00 + 02:00
2016-10-30 01:00:00 + 02:00
2016-10-30 02:00:00 + 02:00
2016-10-30 02:00:00 + 01:00
2016-10-30 03:00:00 + 01:00
2016-10-30 04:00:00 + 01:00
我使用以下代码转换时区,但我得到了类似的内容。
2016-10-30 00:00:00 + 02:00
2016-10-30 01:00:00 + 02:00
2016-10-30 02:00:00 + 02:00
2016-10-30 02:00:00 + 02:00
2016-10-30 03:00:00 + 01:00
2016-10-30 04:00:00 + 01:00
日期实际上来自Excel,但目前我正在尝试检查转换是否正确。
import pytz
import datetime
from pytz.reference import UTC
european = pytz.timezone('Europe/Berlin')
startdate = datetime.datetime(2016,10,30,0,0,0)
hours = []
for i in range(3):
hours.append(startdate + datetime.timedelta(hours = i))
hours.append(hours[2])
for i in range(3,24):
hours.append(startdate + datetime.timedelta(hours = i))
for i in range(len(hours)):
hours[i] = european.localize(hours[i], is_dst = True)
hours[i] = hours[i].astimezone(UTC)
hours[i] = european.normalize(hours[i].astimezone(european))
print(hours[i])
更新:编辑以使问题更清晰;希望
更新:编辑代码中的时间值
答案 0 :(得分:2)
此本地值:
datetime(2016,10,30,2,0,0)
含糊不清。 2016年10月30日凌晨2点在柏林发生两次 - 一次是在2016-10-30T00:00:00Z(UTC偏移为+2),然后再次在2016-10-30T01:00:00Z(UTC偏移量为+1)。
现在,根据您的更新期望,您似乎想要相同的输入值,以便在您第二次调用它时提供不同的输出值...请在输入中查看:
datetime(2016,10,30,0,0,0)
datetime(2016,10,30,1,0,0)
datetime(2016,10,30,2,0,0)
datetime(2016,10,30,2,0,0)
第3行和第4行是相同的。但是你期望输出:
2016-10-30 00:00:00 + 02:00
2016-10-30 01:00:00 + 02:00
2016-10-30 02:00:00 + 02:00
2016-10-30 02:00:00 + 01:00
现在第3和第4行不同了。
我能看到的唯一方法是检测您是否尝试了相同的值,这次通过了is_dst = False
。从根本上说,你不应该期望在相同的输入上运行相同的代码,并且在心理上确定你是否真的意味着"意思是" DST这次与否。
如果您真的在一天中的所有时段都正常运行,那么只需按UTC计算当天的开始时间,并每次为 添加一小时。从根本上说,将本地时间转换为UTC是有问题的,正是因为本地时间模糊不清(围绕"后退")和跳过当地时间(在"春天前进"周围)。
您的问题已多次更改,因此 )但你需要弄清楚你想要用给定的当地时间做什么... is_dst
标志允许你表达对DST的偏好或反对,但你不能指望{{1}比你更了解你的情境。