如何用datetime.strptime解析Python datetime.str()输出的带冒号时区时间戳?
哈哈,这个问题我太熟了!Python标准库的datetime.strptime确实在时区格式上有点死板,咱们一步步说清楚:
解决方案
1. 标准库方案:先预处理字符串再解析
Python的%z格式符确实只支持不带冒号的时区偏移(比如+0000),没法直接解析+00:00这种带冒号的格式。所以得先对字符串做简单处理,去掉时区里的冒号。
方法A:用rpartition分割处理
适合确定时区符号是+或者-的情况:
from datetime import datetime timestamp = "2018-02-21 10:40:35+00:00" # 按最后一个+分割,拿到时区部分 prefix, _, tz_part = timestamp.rpartition("+") # 去掉时区里的冒号 clean_tz = tz_part.replace(":", "") # 重新拼接成符合%z要求的格式 clean_timestamp = f"{prefix}+{clean_tz}" # 现在可以正常解析了 dt = datetime.strptime(clean_timestamp, "%Y-%m-%d %H:%M:%S%z")
如果你的时间戳可能包含负时区(比如-05:00),可以稍微调整一下逻辑:
timestamp = "2018-02-21 10:40:35-05:00" if "+" in timestamp: prefix, _, tz_part = timestamp.rpartition("+") clean_timestamp = f"{prefix}+{tz_part.replace(':', '')}" else: prefix, _, tz_part = timestamp.rpartition("-") clean_timestamp = f"{prefix}-{tz_part.replace(':', '')}" dt = datetime.strptime(clean_timestamp, "%Y-%m-%d %H:%M:%S%z")
方法B:用正则表达式批量替换
更通用的方式,不管时区是正还是负,一次性替换掉冒号:
import re from datetime import datetime timestamp = "2018-02-21 10:40:35+00:00" # 匹配末尾的±HH:MM格式,替换成±HHMM clean_timestamp = re.sub(r"([+-])(\d{2}):(\d{2})$", r"\1\2\3", timestamp) dt = datetime.strptime(clean_timestamp, "%Y-%m-%d %H:%M:%S%z")
2. 第三方库方案:用python-dateutil直接解析
如果不想自己写预处理逻辑,python-dateutil库的解析器可以直接识别带冒号的时区格式,非常省心:
首先安装库:
pip install python-dateutil
然后直接解析:
from dateutil import parser dt = parser.parse("2018-02-21 10:40:35+00:00")
这个方法不仅支持带冒号的时区,还能处理很多其他非标准的时间格式,实用性拉满。
总结一下:如果只能用Python标准库,那预处理字符串是唯一的选择;如果可以引入第三方库,python-dateutil会帮你省不少事。
内容的提问来源于stack exchange,提问作者PaulMcG
相关产品推荐
相关产品推荐

