在西欧,2019-10-27 02:30:00
可能是“两个”时间事件:
datetime
解析器和pytz
如何处理解析此日期的事实可能导致两个不同的时间事件?
import datetime, pytz
d = datetime.datetime.strptime("2019-10-27 02:30:00", '%Y-%m-%d %H:%M:%S')
pst = pytz.timezone('Europe/Paris')
d = pst.localize(d)
print(d) # 2019-10-27 02:30:00+01:00
print(d.timestamp()) # 1572139800.0
事实上,也可能是2019-10-27 02:30:00+02:00
(即夏令时更改之前的UTC + 2,02:30am)。
备注:
import datetime
print(datetime.datetime.fromtimestamp(1572139800.0)) # 2019-10-27 02:30:00
print(datetime.datetime.fromtimestamp(1572136200.0)) # 2019-10-27 02:30:00
((这两个不同的UTC时间戳在欧洲/巴黎时区中确实具有相同的日期时间)
您的问题是强调datetime
模块的一种烦人的行为,默认情况下它们是幼稚的(或不包括时区)。
如果更改代码以包含可选的时区参数,则情况会变得更加清晰:
import pytz
from datetime import datetime
tz = pytz.timezone("Europe/Paris")
print(datetime.fromtimestamp(1572139800.0, tz)) # 2019-10-27 02:30:00+01:00
print(datetime.fromtimestamp(1572136200.0, tz)) # 2019-10-27 02:30:00+02:00
[包括时区,打印中还包含偏移量,以显示时间实际上并不相同。
另一个选择是使用arrow
程序包,以确保始终包含时区。