【问题标题】:Why datetime.datetime.strptime raises ValueError although the format is valid?尽管格式有效,为什么 datetime.datetime.strptime 会引发 ValueError?
【发布时间】:2020-06-24 10:42:01
【问题描述】:

我从数据库中获取了这个日期字符串格式,我需要将其转换为日期时间对象才能进行减法。

'from': '2020-06-24T10:12:00.692+00:00'

我尝试过这种格式,但不起作用。

"%Y-%m-%dT%H:%M:%S.%f%z"

这个字符串在 python 中是否可以转换?

更新: 那是我运行的strptime

datetime_obj1= datetime.strptime(row['from'], "%Y-%m-%dT%H:%M:%S.%f%z")

我得到的错误

ValueError                                Traceback (most recent call last)
<ipython-input-11-7798f7219c52> in <module>
     23 for row in list_of_events:
     24     print(row['id'])
---> 25     datetime_obj1= datetime.strptime(row['from'], "%Y-%m-%dT%H:%M:%S%z")
     26     print(datetime_obj1)
     27     #print(row['from']-row['to'])

/usr/lib/python3.6/_strptime.py in _strptime_datetime(cls, data_string, format)
    563     """Return a class cls instance based on the input string and the
    564     format string."""
--> 565     tt, fraction = _strptime(data_string, format)
    566     tzname, gmtoff = tt[-2:]
    567     args = tt[:6] + (fraction,)

/usr/lib/python3.6/_strptime.py in _strptime(data_string, format)
    360     if not found:
    361         raise ValueError("time data %r does not match format %r" %
--> 362                          (data_string, format))
    363     if len(data_string) != found.end():
    364         raise ValueError("unconverted data remains: %s" %

ValueError: time data '2020-06-24T10:12:00.692+00:00' does not match format '%Y-%m-%dT%H:%M:%S%z'

【问题讨论】:

  • 在 Python 3.7+ 上,使用 datetime.fromisoformat('2020-06-24T10:12:00.692+00:00') - 顺便说一下,strptime 的格式代码对我来说也很好......

标签: python python-3.x datetime


【解决方案1】:

here 解析 RFC 3339 日期和时间存在问题,在 python3.7 上已解决。

所以 python3.7 不支持 %z

【讨论】:

  • 很好,还不知道那个...我想知道为什么 Z 字符可以在 strptime 中由%z 解析,但不能由fromisoformat() 解析...(另请参阅here )
【解决方案2】:

没有一些实际的代码,很难说你的错误在哪里。

您建议的日期格式可以正常工作...

>>> from datetime import datetime
>>> datetime.strptime("2020-06-24T10:12:00.692+00:00", "%Y-%m-%dT%H:%M:%S.%f%z")
datetime.datetime(2020, 6, 24, 10, 12, 0, 692000, tzinfo=datetime.timezone.utc)

【讨论】:

【解决方案3】:

在较旧的 Python 版本上,您应该能够使用 dateutil 的解析器:

from dateutil import parser

s = '2020-06-24T10:12:00.692+00:00'
dtobj = parser.parse(s)
# dtobj
# datetime.datetime(2020, 6, 24, 10, 12, 0, 692000, tzinfo=tzutc())

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-09-25
    • 1970-01-01
    • 2020-05-08
    • 2019-12-28
    • 1970-01-01
    • 2015-08-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多