当前,我们正在开发一个应用程序,该应用程序正在尝试使用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版本不同吗?我们如何解析或转换它而不会出现错误?
答案 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:MM
或HH: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)))