Это неправильно, потому что вы просто отбрасываете информацию о часовом поясе (в этом случае смещение UTC ( + 8 часов)).
Для получения более подробной информации, проверьте [Python 3.Docs]: datetime - strftime () и strptime () Поведение (% z директива).
>>> import datetime
>>>
>>> start_time = "2019-05-15T16:08:37+08:00"
>>>
>>> dt0 = datetime.datetime.strptime(start_time, "%Y-%m-%dT%H:%M:%S+08:00")
>>> dt0
datetime.datetime(2019, 5, 15, 16, 8, 37)
>>> dt0.tzinfo
>>>
>>> dt_format_string = "%Y-%m-%dT%H:%M:%S%z" # This format string also takes timezone info (UTC offset) into account
>>> dt1 = datetime.datetime.strptime(start_time, dt_format_string)
>>> dt1
datetime.datetime(2019, 5, 15, 16, 8, 37, tzinfo=datetime.timezone(datetime.timedelta(seconds=28800)))
>>> dt1.tzinfo
datetime.timezone(datetime.timedelta(seconds=28800))
>>>
>>> dt2 = datetime.datetime.strptime("2019-05-15T16:08:37+08:45", dt_format_string) # Changed the offset to +08:45
>>> dt2
datetime.datetime(2019, 5, 15, 16, 8, 37, tzinfo=datetime.timezone(datetime.timedelta(seconds=31500)))
Рассматриваемый временной сдвиг соответствует группе часовых поясов: AWST , CST , HKT , IRKT , MYT , PHT , SGT , WITA , ... (проверьте [TimeAndDate]: Сокращения часовых поясов - всемирный список для полного списка).
@ EDIT0
Все выше на Python 3. 7 (. 3) (и кажется, что документ и функциональность НЕ синхронизированы ).
Вкл. Python 3. 6 (. 8) :
>>> datetime.datetime.strptime("2019-05-15T16:08:37+08:45", "%Y-%m-%dT%H:%M:%S%z")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "c:\install\x64\python\python\03.06.08\Lib\_strptime.py", line 565, in _strptime_datetime
tt, fraction = _strptime(data_string, format)
File "c:\install\x64\python\python\03.06.08\Lib\_strptime.py", line 362, in _strptime
(data_string, format))
ValueError: time data '2019-05-15T16:08:37+08:45' does not match format '%Y-%m-%dT%H:%M:%S%z'
Для этого, как показано в:
одним из способов было бы (установить и) использовать dateutil :
>>> import sys
>>> sys.version
'3.6.8 (tags/v3.6.8:3c6b436a57, Dec 24 2018, 00:16:47) [MSC v.1916 64 bit (AMD64)]'
>>>
>>> from dateutil import parser
>>> parser.parse("2019-05-15T16:08:37+08:00")
datetime.datetime(2019, 5, 15, 16, 8, 37, tzinfo=tzoffset(None, 28800))
Или вы можете удалить (последнее) двоеточие между часами и минутами (для UTC смещение). Обратите внимание, что приведенный ниже код основан на смещении UTC , заданном в фиксированном формате из вопроса:
>>> start_time = "2019-05-15T16:08:37+08:00"
>>>
>>> dt_format_string = "%Y-%m-%dT%H:%M:%S%z"
>>>
>>> datetime.datetime.strptime(start_time[:-3] + start_time[-2:], dt_format_string)
datetime.datetime(2019, 5, 15, 16, 8, 37, tzinfo=datetime.timezone(datetime.timedelta(0, 28800)))
Но оба они кажутся просто обходными путями.