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

.NET配置DTO的DateTime默认格式,解决Swagger序列化适配问题

解决Swagger与DTO DateTime格式不匹配的问题

首先明确:[DisplayFormat] 特性仅用于MVC视图渲染,不会影响JSON序列化逻辑,这就是你配置了格式但Swagger仍使用ISO格式的核心原因。以下针对不同JSON序列化库给出具体解决方案:

一、使用Newtonsoft.Json(ASP.NET Core 3.0前默认,之后需手动引入)

1. 全局统一配置(推荐)

在Program.cs中配置全局序列化规则,所有DateTime类型都会采用指定格式:

builder.Services.AddControllers()
    .AddNewtonsoftJson(options =>
    {
        options.SerializerSettings.DateFormatString = "yyyy-MM-dd HH:mm:ss";
        // 如需处理时区,可按需添加:
        // options.SerializerSettings.DateTimeZoneHandling = DateTimeZoneHandling.Local;
    });

2. 单个DTO属性单独配置

如果仅需特定属性使用该格式,给Timestamp添加[JsonConverter]特性:

public class TimeStampDTO
{
    [JsonConverter(typeof(IsoDateTimeConverter), "yyyy-MM-dd HH:mm:ss")]
    public DateTime Timestamp { get; set; }
}

注意:需确保项目已安装Newtonsoft.Json NuGet包。

二、使用System.Text.Json(ASP.NET Core 3.0+默认)

1. 全局统一配置(推荐)

先自定义DateTime转换器,再在Program.cs中全局注册:

// 自定义DateTime格式转换器
public class DateTimeFormatConverter : JsonConverter<DateTime>
{
    private readonly string _format;

    public DateTimeFormatConverter(string format)
    {
        _format = format;
    }

    public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
    {
        return DateTime.ParseExact(reader.GetString(), _format, CultureInfo.InvariantCulture);
    }

    public override void Write(Utf8JsonWriter writer, DateTime value, JsonSerializerOptions options)
    {
        writer.WriteStringValue(value.ToString(_format, CultureInfo.InvariantCulture));
    }
}

// 在Program.cs中配置
builder.Services.AddControllers()
    .AddJsonOptions(options =>
    {
        options.JsonSerializerOptions.Converters.Add(new DateTimeFormatConverter("yyyy-MM-dd HH:mm:ss"));
    });

2. 单个DTO属性单独配置

给目标属性指定自定义转换器:

public class TimeStampDTO
{
    [JsonConverter(typeof(DateTimeFormatConverter), "yyyy-MM-dd HH:mm:ss")]
    public DateTime Timestamp { get; set; }
}

三、同步Swagger示例格式

配置序列化规则后,Swagger默认示例可能仍显示ISO格式,需修改Swagger Schema配置更新示例:

builder.Services.AddSwaggerGen(c =>
{
    c.MapType<DateTime>(() => new OpenApiSchema
    {
        Type = "string",
        Example = new OpenApiString(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"))
    });
});

完成以上配置后,Swagger会显示你需要的yyyy-MM-dd HH:mm:ss格式示例,接口也能正确完成DateTime的序列化与反序列化。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 20:21:12