如何通过datetime模块将UTC格式时间“ 2019-05-15T16:08:37 + 08:00”转换为通常的datetime对象?

时间:2019-05-15 08:57:55

标签: python datetime

有一个时间字符串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 个答案:

答案 0 :(得分:1)

这是不对的,因为您只是丢弃了时区信息(在这种情况下,是 UTC 偏移量( +8 小时))。
有关更多详细信息,请检查[Python 3.Docs]: datetime - strftime() and strptime() Behavior %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]: Time Zone Abbreviations – Worldwide List列表)。

@ 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)))

但这两个似乎都只是解决方法。