【问题标题】:python dateutil.parser wrong (??) parsingpython dateutil.parser 错误 (??) 解析
【发布时间】:2018-06-18 10:47:39
【问题描述】:

我正在尝试以下(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 时,解析器似乎产生了错误的输出。我错过了什么,还是这是一个错误?

【问题讨论】:

  • 如果使用 isoparse 而不是 parse 会发生什么?
  • dateutil.parser.isoparse('0001-04-23T01:25:43.511Z') 给出datetime.datetime(1, 4, 23, 1, 25, 43, 511000, tzinfo=tzutc()) - 但简单解析也是如此。我无法重现这个。
  • 我似乎在解析器中找不到isoparse 方法
  • 好的,它在 dateutil 的 2.7 版本中。工作正常

标签: python parsing datetime python-dateutil


【解决方案1】:

dateutil 中的 was a bug 已修复(初始工作 here,但此特定边缘情况已修复 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-06-18
    • 1970-01-01
    • 2018-05-21
    • 1970-01-01
    • 2013-11-24
    • 1970-01-01
    • 2018-02-01
    • 2014-04-10
    相关资源
    最近更新 更多