有一个时间字符串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
但我认为这是不对的...
答案 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)))
但这两个似乎都只是解决方法。