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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 21:47:01