带有时区的冒号偏移的Datetime strptime问题

时间:2019-01-19 15:11:17

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

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

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

以下示例在使用Python 3.6.7的Linux上给出了错误:

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版本不同吗?我们如何解析或转换它而不会出现错误?

1 个答案:

答案 0 :(得分:0)

是的,这是版本问题。您依赖于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)))