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

Python如何解决datetime格式转换时时区导致的strptime匹配错误

匹配错误根因

报错是因为你编写的格式字符串和实际时间串存在两处不匹配:

  • 日期与时间的分隔符不符:实际时间串中日期2017-11-19和时间03:12:34之间是大写字母T,你写的格式串对应位置用了空格
  • 时区匹配符用错:末尾的+0800是数字格式的时区偏移,需要用小写的%z匹配;大写%Z仅支持匹配UTC、CST这类文本格式的时区名称,不支持数字偏移

另外你的代码逻辑存在错误:你解析的时间串本身已经携带东八区的时区偏移,解析后就是带时区信息的感知型(aware) datetime,不需要再用纽约时区做本地化,否则会把东八区时间错误识别为纽约时间,得到完全错误的UTC结果。

修复方案

方法1:调整strptime格式串(兼容所有Python 3.2及以上版本)

直接修改格式串匹配实际时间结构即可,无需额外处理字符替换:

from datetime import datetime
import pytz

# 按实际时间结构写格式串
aware_datetime = datetime.strptime('2017-11-19T03:12:34+0800', "%Y-%m-%dT%H:%M:%S%z")
# 直接转UTC
utc_datetime = aware_datetime.astimezone(pytz.utc)

# 输出示例:2017-11-18 19:12:34+00:00
print(utc_datetime)

方法2:使用内置ISO解析方法(Python 3.11及以上版本)

不需要手写格式串,直接调用fromisoformat即可解析该标准ISO格式时间:

from datetime import datetime
import pytz

aware_datetime = datetime.fromisoformat('2017-11-19T03:12:34+0800')
utc_datetime = aware_datetime.astimezone(pytz.utc)

低版本Python兼容方案(Python <3.2)

Python 3.2以下版本的原生strptime不支持%z,可以用python-dateutil库的解析器处理:

from dateutil import parser
import pytz

aware_datetime = parser.parse('2017-11-19T03:12:34+0800')
utc_datetime = aware_datetime.astimezone(pytz.utc)

内容的提问来源于stack exchange,提问作者HappyDuppy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 23:27:03