Да, это проблема версии.Вы полагаетесь на новую функцию , представленную в Python 3.7
Из datetime.strptime()
документации , 6-я сноска:
Изменено в версии 3.7 : если для метода strptime()
указана директива %z
, смещения 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()
метод ;он может анализировать ваш ввод напрямую.
>>> datetime.fromisoformat(datetimestring)
datetime.datetime(2019, 1, 19, 15, 13, tzinfo=datetime.timezone(datetime.timedelta(seconds=3600)))