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
相关产品推荐
相关产品推荐

