DST更改发生时将字符串解析为日期

问题描述 投票:0回答:1

在西欧,2019-10-27 02:30:00可能是“两个”时间事件:

  • DST在03:00更改之前,上午02:30
  • 03:30 am,变成(在03:00 DST更改后)02:30 am

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时间戳在欧洲/巴黎时区中确实具有相同的日期时间)

python datetime time dst pytz
1个回答
0
投票

您的问题是强调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程序包,以确保始终包含时区。

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.