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

Web API 2.0中如何将DateTime类型返回为日期而非JSON时间戳

我明白你的痛点——后端返回的日期总是带着T00:00:00的后缀,虽然前端能转换,但就是想在后端一步到位搞定对吧?结合你的C#代码片段(看起来是ASP.NET相关项目),给你几个实用的后端解决方案:

方案1:使用DTO(数据传输对象)——最推荐的方式

这个思路是把业务模型和对外传输的模型分开,避免修改原实体类影响其他业务逻辑,步骤很简单:

  1. 创建一个和原Todo类对应的DTO类,把日期字段改成字符串类型:
public class TodoDto
{
    // 复制原Todo类的其他属性,比如Id、Content等
    public int Id { get; set; }
    public string Content { get; set; }
    // 日期字段改为字符串,用于格式化输出
    public string ToDoDate { get; set; }
}
  1. 在接口返回数据时,把原Todo列表映射成TodoDto列表,同时格式化日期:
var formattedTodos = Todos.Select(todo => new TodoDto
{
    Id = todo.Id,
    Content = todo.Content,
    ToDoDate = todo.ToDoDate.Date.ToString("dd-MM-yyyy")
}).ToList();

return Ok(formattedTodos);

这样返回的JSON里,ToDoDate就会是DD-MM-YYYY的格式,而且完全不会影响原Todo类在其他地方的使用。

方案2:自定义JSON序列化转换器

如果不想额外创建DTO,可以通过自定义转换器来修改JSON序列化时的日期格式。

对于System.Text.Json(ASP.NET Core 3.0+默认)

  1. 先写一个自定义的日期转换器:
public class ShortDateConverter : JsonConverter<DateTime>
{
    // 反序列化逻辑(如果需要从前端接收日期的话)
    public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
    {
        return DateTime.Parse(reader.GetString());
    }

    // 序列化时格式化日期
    public override void Write(Utf8JsonWriter writer, DateTime value, JsonSerializerOptions options)
    {
        writer.WriteStringValue(value.Date.ToString("dd-MM-yyyy"));
    }
}
  1. 在Program.cs或Startup.cs里全局配置这个转换器:
builder.Services.AddControllers()
    .AddJsonOptions(options =>
    {
        options.JsonSerializerOptions.Converters.Add(new ShortDateConverter());
    });

或者如果只想给特定属性用这个转换器,直接在Todo类的属性上加标记:

[JsonConverter(typeof(ShortDateConverter))]
public DateTime ToDoDate { get; set; }

对于Newtonsoft.Json(旧版ASP.NET或手动引用)

如果项目用的是Newtonsoft.Json,操作更简单:
在Todo类的日期属性上加上注解,指定日期格式:

[JsonConverter(typeof(IsoDateTimeConverter))]
[JsonProperty(PropertyName = "ToDoDate")]
public DateTime ToDoDate { get; set; }

然后全局配置日期格式:

JsonConvert.DefaultSettings = () => new JsonSerializerSettings
{
    DateFormatString = "dd-MM-yyyy"
};

方案3:给实体类添加格式化后的只读属性

这个方法最直接,在原Todo类里加一个专门用于返回的格式化日期属性,同时隐藏原日期属性:

// 隐藏原日期属性,不让它序列化到JSON里
[JsonIgnore]
public DateTime ToDoDate { get; set; }

// 把格式化后的日期作为ToDoDate返回
[JsonProperty("ToDoDate")]
public string FormattedToDoDate => ToDoDate.Date.ToString("dd-MM-yyyy");

这样接口返回的ToDoDate就是你要的格式了,但要注意这个修改会影响所有序列化该实体类的地方,如果其他接口需要原日期格式的话就不太适用。


总的来说,最推荐用DTO方案,既灵活又不会破坏原有业务逻辑,适合大多数场景。

内容的提问来源于stack exchange,提问作者Web Develop Wolf

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 10:38:34