Web API 2.0中如何将DateTime类型返回为日期而非JSON时间戳
我明白你的痛点——后端返回的日期总是带着T00:00:00的后缀,虽然前端能转换,但就是想在后端一步到位搞定对吧?结合你的C#代码片段(看起来是ASP.NET相关项目),给你几个实用的后端解决方案:
方案1:使用DTO(数据传输对象)——最推荐的方式
这个思路是把业务模型和对外传输的模型分开,避免修改原实体类影响其他业务逻辑,步骤很简单:
- 创建一个和原
Todo类对应的DTO类,把日期字段改成字符串类型:
public class TodoDto { // 复制原Todo类的其他属性,比如Id、Content等 public int Id { get; set; } public string Content { get; set; } // 日期字段改为字符串,用于格式化输出 public string ToDoDate { get; set; } }
- 在接口返回数据时,把原
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+默认)
- 先写一个自定义的日期转换器:
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")); } }
- 在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
相关产品推荐
相关产品推荐

