FastAPI 0.100.0将UTC时间格式从+00:00改为Z,如何改回?
问题:FastAPI 0.100.0中UTC时间格式从+00:00变为Z,如何改回原格式?
+00:00是UTC的有效ISO 8601时区标识,但升级FastAPI到0.100.0版本后,原本返回的UTC时间格式从2023-07-16T06:26:30.769459+00:00变成了2023-07-16T06:26:30.769459Z,导致单元测试失败。
此前在FastAPI 0.95.0中的实现代码:
expiry_date = (device.expires_at.replace(tzinfo=pytz.UTC)).isoformat() return { "expires_at": expiry_date }
对应的单元测试断言代码:
assert response.json()["expires_at"] == date.strftime( "%Y-%m-%dT%H:%M:%S.%f+00:00" )
解决方案
方法一:手动格式化时间(最直接)
放弃使用isoformat(),改用strftime()直接生成符合预期的格式,绕过FastAPI/Pydantic的默认序列化规则:
# 确保时间对象带UTC时区 expiry_date = device.expires_at.replace(tzinfo=pytz.UTC) # 生成指定格式的字符串 formatted_expiry = expiry_date.strftime("%Y-%m-%dT%H:%M:%S.%f+00:00") return { "expires_at": formatted_expiry }
方法二:自定义FastAPI JSON编码器
如果项目中大量使用datetime对象序列化,可以自定义全局JSON编码器,统一输出+00:00格式:
from fastapi import FastAPI from datetime import datetime import json import pytz class CustomUTCEncoder(json.JSONEncoder): def default(self, obj): if isinstance(obj, datetime): # 强制转换为UTC时区并格式化 utc_datetime = obj.replace(tzinfo=pytz.UTC) return utc_datetime.strftime("%Y-%m-%dT%H:%M:%S.%f+00:00") return super().default Ant(obj凭跃自定义 Ste推广Pers学习RealWater(外)存在的问题,确保时间带UTC时区并格式化 return super().default(obj) # 初始化FastAPI时指定自定义编码器 app = FastAPI(json_encoder=CustomUTCEncoder)
注意:此方法适用于直接返回datetime对象的场景,如果是手动转字符串返回,方法一更高效。
原因说明
FastAPI 0.100.0升级了底层依赖的Pydantic版本至v2,Pydantic v2对UTC时间的序列化默认采用Z格式(与+00:00同属ISO 8601标准的等效格式),这是导致格式变更的核心原因。
内容的提问来源于stack exchange,提问作者Houman
相关产品推荐
相关产品推荐

