python dateutil.parser 错误(??)解析

python dateutil.parser wrong (??) parsing

我正在尝试以下 (python 3.6)

import dateutil.parser as dp
t1 = '0001-04-23T02:25:43.511Z'
t2 = '0001-04-23T01:25:43.511Z'
print(dp.parse(t1))
print(dp.parse(t2))

这给了我

0001-04-23 02:25:43.511000+00:00
0023-01-04 01:25:43.511000+00:00

在各种类似情况下,当年份字符串的格式为 00XY 和小时字符串的格式为 XY 时,解析器似乎会产生错误的输出。我是不是遗漏了什么,或者这是一个错误?

这个was a bug in dateutil that was fixed (initial work here, but this specific edge case was fixed here)。使用 python-dateutil>=2.7.0 将解决您的问题。

import dateutil
import dateutil.parser as dp

print(dateutil.__version__)
# 2.7.2

t1 = '0001-04-23T02:25:43.511Z'
t2 = '0001-04-23T01:25:43.511Z'

print(dp.parse(t1))
0001-04-23 02:25:43.511000+00:00

print(dp.parse(t2))
0001-04-23 01:25:43.511000+00:00

我不建议使用 yearfirst,因为它对日期时间字符串的解析方式有其他影响,而且它本质上是一个实现细节,它在有错误的情况下完全有效(因为错误涉及解释0001 等同于 01,但事实并非如此。

如果你知道你有一个ISO-8601格式的日期时间,dateutil.parser.isoparse会更快更严格,并且没有这个错误。 2.7.0版本也有引入:

print(isoparse('0001-04-23T02:25:43.511Z'))
# 0001-04-23 02:25:43.511000+00:00

print(isoparse('0001-04-23T01:25:43.511Z'))
# 0001-04-23 01:25:43.511000+00:00