使用 Python 中的时区正确解析日期

Correctly parse dates with timezones in Python

我在欧洲工作,我有一系列日期时间,如下所示:

 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])

更新:已编辑以使问题更清楚;希望
更新:编辑了代码中的时间值

这个本地值:

datetime(2016,10,30,2,0,0)

是模棱两可的。 2am 于 2016 年 10 月 30 日在柏林发生两次 - 一次在 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。从根本上说,您不应该期望 运行 相同输入的相同代码,它会从心理上判断您这次是否真的 "meant" DST。

如果您确实运行一天中的所有时间都在忙碌,那么只需计算出 UTC 中一天的开始时间,然后在 [=34] 基础上加一个小时=] 每次。从根本上说,将本地时间转换为 UTC 恰恰是有问题的,因为本地时间可能不明确("fall back" 左右)并跳过本地时间("spring forward" 左右)。

你的问题已经改变了好几次,所以真的不清楚你的输入数据是什么(与Excel有关,但很可能不是你的值已经向我们展示过)但是你需要弄清楚你想在给定的本地时间做什么...... is_dst 标志允许你表达对 DST 的偏好或反对,但你不能期望 pytz比你更了解你的背景。