首页 > 解决方案 > Python strptime 无法理解时区偏移

问题描述

我有一个非常简单的时间戳需要解析:

10/2/2020 3:19:42 PM (UTC-7)

但是使用 python 3.6,当我尝试解析它时,我得到以下信息:

>>> datetime.strptime('10/2/2020 3:19:42 PM (UTC-7)', '%m/%d/%Y %I:%M:%S %p (%Z%z)')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "_strptime.py", line 565, in _strptime_datetime
    tt, fraction = _strptime(data_string, format)
  File "_strptime.py", line 362, in _strptime
    (data_string, format))
ValueError: time data '10/2/2020 3:19:42 PM (UTC-7)' does not match format '%m/%d/%Y %I:%M:%S %p (%Z%z)'

我已经尝试过dateutil.parser,以及格式字符串的几种变体。绊倒的部分strptime(UTC-7)部分。

字符串格式错了吗?如何解析这个字符串并接收时区信息?任何帮助表示赞赏。

编辑:如果字符串是 (UTC-0700) 则解析有效。但我无法控制时间戳的格式,有没有办法以当前格式(UTC-7)解析它们?

标签: python-3.xstrptime

解决方案


啊,原来是很傻:

>>> import dateutil
>>> dateutil.parser.parse(dt, fuzzy=True)
datetime.datetime(2020, 10, 2, 15, 19, 42, tzinfo=tzoffset(None, 25200))

之前应该使用模糊逻辑。:-)

编辑:以上不起作用(感谢@wim 指出) - 模糊标志忽略了偏移字符串的符号。

这是有效的代码:

>>> from datetime import datetime
>>> import re
>>> dt = '10/2/2020 3:19:42 PM (UTC-7)'
>>> sign, offset = re.search('\(UTC([+-])(\d+)\)', dt).groups()
>>> offset = f"0{offset}00" if len(offset) == 1 else f"{offset}00"
>>> dt = re.sub(r'\(UTC.\d+\)', f'(UTC{sign}{offset})', dt)
>>> datetime.strptime(dt, '%m/%d/%Y %I:%M:%S %p (%Z%z)')
datetime.datetime(2020, 10, 2, 15, 19, 42, tzinfo=datetime.timezone(datetime.timedelta(-1, 61200), 'UTC'))

推荐阅读