You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 09:25:22