当我解析以下时间字符串时,我在几秒钟内得到两个不同的结果:
方法一:
from datetime import datetime
int(datetime.strptime('2015-03-25T19:46:23.286966Z', '%Y-%m-%dT%H:%M:%S.%fZ').timestamp())
产量1427309183
方法2:
from dateutil.parser import parse
int(parse('2015-03-25T19:46:23.286966Z').timestamp())
产量1427312783
似乎方法 1 忽略了 TZ 与方法 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 偏移量。
您可以正确解析,例如
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)
关于python - datetime.strptime 和 dateutil 解析之间的区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67358886/