datetime.strptime 和从 dateutil 解析之间的区别?

Difference between datetime.strptime and parse from dateutil?

当我解析以下时间字符串时,我在几秒钟内得到了两个不同的结果:

方法一:

from datetime import datetime

int(datetime.strptime('2015-03-25T19:46:23.286966Z', '%Y-%m-%dT%H:%M:%S.%fZ').timestamp())

产量1427309183

方法二:

from dateutil.parser import parse

int(parse('2015-03-25T19:46:23.286966Z').timestamp())

产量1427312783

似乎方法 1 忽略了 TZ vs 方法 do(我 运行 它来自 UTC+1 tz)。

问题:为什么这两种方法会产生不同的秒时间戳?有人可以解释一下幕后发生的事情以及如何最好地处理这种情况。

我的目标是将字符串转换为 unix 纪元时间(即 utc)中的秒数。

如果您查看中间结果(日期时间对象)的 repr,您会发现一个不同之处:

from datetime import datetime
from dateutil.parser import parse

print(repr(datetime.strptime('2015-03-25T19:46:23.286966Z', '%Y-%m-%dT%H:%M:%S.%fZ')))
# datetime.datetime(2015, 3, 25, 19, 46, 23, 286966)

print(repr(parse('2015-03-25T19:46:23.286966Z')))
# datetime.datetime(2015, 3, 25, 19, 46, 23, 286966, tzinfo=tzutc())

第一个是幼稚的,没有设置 tzinfo,因为您在解析指令中使用了文字 Z。第二个是有意识的; tzinfo 设置为 UTC,因为 dateutil 的解析器识别 Z 来表示 UTC。这造成了时间戳的差异,因为 Python 将原始日期时间视为 当地时间 - 因此相差 1 小时,这是您当地时间的 UTC 偏移量。

你可以正确解析like

print(repr(datetime.fromisoformat('2015-03-25T19:46:23.286966Z'.replace('Z', '+00:00'))))
# datetime.datetime(2015, 3, 25, 19, 46, 23, 286966, tzinfo=datetime.timezone.utc)

另见 here

或不太方便(恕我直言),strptime:

print(repr(datetime.strptime('2015-03-25T19:46:23.286966Z', '%Y-%m-%dT%H:%M:%S.%f%z')))
# datetime.datetime(2015, 3, 25, 19, 46, 23, 286966, tzinfo=datetime.timezone.utc)