python-3.x - 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)解析它们?
解决方案
啊,原来是很傻:
>>> 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'))
推荐阅读
- c - 为什么 snprintf 与 swprintf 的行为不同?
- python - 为什么我的游戏代码在 pygame 上显示为黑屏?
- c# - Azure 函数无法命中 HttpTrigger
- mongodb - .shift 在 MongoDB 中会做什么?
- python - 具有 Python 请求的多个唯一自治会话
- c++ - 发布多个 mqtt 主题和传感器值的缓冲区大小
- google-cloud-platform - google pub sub 中的消息排序是否遵守截止日期?
- android - 运行颤振医生失败
- python-3.x - SQLAlchemy @event.listens_for(Class, 'after_insert') 用于 SQL 表达式“INSERT INTO table(cols) VALUES (values)”
- java - Mockito 和 PowerMock:需要但未调用