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

标签 python datetime timezone python-dateutil

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

方法一:

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/

相关文章:

Python向图像添加噪声破坏PNG

python - 帮助处理 python Entry 小部件中的 <key> 事件

python - 基于增长率优化值的迭代计算

python - 查找多个 datetime.timedelta 对象的最小公倍数

python - Django 模板将模板变量传递给剪切过滤器

python - Facebook 时间戳到 Python DateTime 对象

python - 如何在一行中计算数据框中的并发事件?

Mysql:如何诊断和纠正错误的时区

python夏令时问题

java - Joda Time 从 MutableDateTime 实例中减去 24 小时,我想知道为什么