8

目前我们正在开发一个应用程序,它试图使用 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 版本吗?我们如何才能正确地解析或转换它?

4

1 回答 1

3

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

datetime.strptime()文档中,第 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:MM正则表达式从任何或偏移中删除冒号HH:MM:SS(出现在字符串的末尾并以-or开头+):

演示:

>>> 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()方法;它可以直接解析您的输入。

>>> datetime.fromisoformat(datetimestring)
datetime.datetime(2019, 1, 19, 15, 13, tzinfo=datetime.timezone(datetime.timedelta(seconds=3600)))
于 2019-01-19T15:16:52.317 回答