【问题标题】:Datetime strptime issue with a timezone offset with colons [duplicate]带有冒号的时区偏移的日期时间strptime问题[重复]
【发布时间】:2019-01-19 15:11:17
【问题描述】:

目前,我们正在开发一个应用程序,该应用程序正在尝试使用 2.db.transport.rest API 计算从 a 到 b 的路线的行程时间。

不幸的是,我们收到的时间戳带有与该 API 的时区偏移量,例如 +01:00。我们需要的是一个没有:的时区偏移量,所以+0100

以下示例在 Linux 上使用 Python 3.6.7 时出现错误:

from datetime import datetime
datetimestring = "2019-01-19T15:13:00.000+01:00"
datetime.strptime(datetimestring, '%Y-%m-%dT%H:%M:%S.%f%z')

此示例代码产生此异常:

ValueError: time data '2019-01-19T15:13:00.000+01:00' does not match format '%Y-%m-%dT%H:%M:%S.%f%z'

如果我们从输入字符串中删除:,它会起作用,不会引发异常。

当我们在 Windows、Python 3.7.2 上运行此代码时,该代码也可以工作。

会不会是因为 Python 版本不同?我们如何才能正确地解析或转换它?

【问题讨论】:

    标签: python python-3.6 python-datetime python-3.7


    【解决方案1】:

    是的,这是版本问题。您依赖于 Python 3.7 中引入的新功能

    来自datetime.strptime() documentation,第 6 个脚注:

    在 3.7 版中更改:当 %z 指令提供给 strptime() 方法时,UTC 偏移量可以使用冒号作为小时、分钟和秒之间的分隔符。例如,'+01:00:00' 将被解析为一小时的偏移量。

    如果您无法在任何地方升级到 Python 3.7,那么您可以通过一些预处理删除这些冒号:

    import re
    
    datetimestring = re.sub(r'([-+]\d{2}):(\d{2})(?:(\d{2}))?$', r'\1\2\3', datetimestring)
    

    正则表达式从任何HH:MMHH:MM:SS 偏移中删除冒号(出现在 字符串结尾,前面有-+):

    演示:

    >>> import re
    >>> from datetime import datetime
    >>> datetimestring = "2019-01-19T15:13:00.000+01:00"
    >>> corrected = re.sub(r'([-+]\d{2}):(\d{2})(?:(\d{2}))?$', r'\1\2\3', datetimestring)
    >>> corrected
    '2019-01-19T15:13:00.000+0100'
    >>> datetime.strptime(corrected, '%Y-%m-%dT%H:%M:%S.%f%z')
    datetime.datetime(2019, 1, 19, 15, 13, tzinfo=datetime.timezone(datetime.timedelta(seconds=3600)))
    

    如果您要在任何地方升级到 Python 3.7,您可以完全放弃 strptime() 解析,而只需使用专用的 datetime.fromisoformat() method;它可以直接解析你的输入。

    >>> datetime.fromisoformat(datetimestring)
    datetime.datetime(2019, 1, 19, 15, 13, tzinfo=datetime.timezone(datetime.timedelta(seconds=3600)))
    

    【讨论】:

      猜你喜欢
      • 2014-05-24
      • 2017-05-15
      • 2021-12-19
      • 1970-01-01
      • 2017-04-13
      • 1970-01-01
      • 2011-11-30
      • 2022-10-19
      • 2018-03-15
      相关资源
      最近更新 更多