使用Python

时间:2016-09-05 12:33:19

标签: python datetime timezone dst pytz

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

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

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

1 个答案:

答案 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}比你更了解你的情境。