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
我正在尝试以下 (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