是的,这是版本问题。你依赖于一个新功能Python 3.7 中引入
来自datetime.strptime()文档 https://docs.python.org/3/library/datetime.html#strftime-and-strptime-behavior,第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
or HH:MM:SS
偏移量(出现在
字符串的末尾,前面是-
or +
):
Demo:
>>> 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 https://docs.python.org/3/library/datetime.html#datetime.time.fromisoformat;它可以直接解析您的输入。
>>> datetime.fromisoformat(datetimestring)
datetime.datetime(2019, 1, 19, 15, 13, tzinfo=datetime.timezone(datetime.timedelta(seconds=3600)))