Как я могу преобразовать время в формате UTC "2019-05-15T16: 08: 37 + 08: 00" в обычный объект datetime с помощью модуля datetime? - PullRequest
0 голосов
/ 15 мая 2019

Есть временная строка 2019-05-15T16:08:37+08:00 Я получил от внешнего интерфейса, и я хочу преобразовать ее в обычный datetime объект, используя datetime

Как я могу сделать это правильно?

Я пытался

start_time_utc_s = "2019-05-15T16:08:37+08:00"
r = datetime.datetime.strptime(start_time_utc_s, "%Y-%m-%dT%H:%M:%S+08:00")

# print(r)
# 2019-05-15 16:08:37

, но я не думаю, что это правильно ...

1 Ответ

1 голос
/ 15 мая 2019

Это неправильно, потому что вы просто отбрасываете информацию о часовом поясе (в этом случае смещение 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)))

Но оба они кажутся просто обходными путями.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...