如何在ASP.NET响应中保留DateTime的毫秒格式?
ASP.NET返回DateTime丢失毫秒的解决方法
一、使用System.Text.Json(默认序列化方式)
1. 全局配置(推荐)
在Program.cs(或Startup.cs)中配置Json序列化选项,强制DateTime输出包含毫秒的格式:
builder.Services.AddControllers() .AddJsonOptions(options => { // 为DateTime类型添加自定义转换器,指定带毫秒的格式 options.JsonSerializerOptions.Converters.Add(new JsonConverter<DateTime> { Write = (writer, dateTime) => { writer.WriteStringValue(dateTime.ToString("yyyy-MM-ddTHH:mm:ss.fff")); }, Read = (reader) => { return DateTime.Parse(reader.GetString()!); } }); // 如需支持DateTimeOffset,添加对应转换器 options.JsonSerializerOptions.Converters.Add(new JsonConverter<DateTimeOffset> { Write = (writer, dateTimeOffset) => { writer.WriteStringValue(dateTimeOffset.ToString("yyyy-MM-ddTHH:mm:ss.fffzzz")); }, Read = (reader) => { return DateTimeOffset.Parse(reader.GetString()!); } }); });
2. 属性级别配置
如果仅需单个属性保留毫秒,可在Event类的HappenedAt属性上绑定自定义转换器:
public class Event { public Event(DateTime happenedAt) { HappenedAt = happenedAt; } [JsonConverter(typeof(CustomDateTimeConverter))] public DateTime HappenedAt { get; } } // 自定义DateTime转换器 public class CustomDateTimeConverter : 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.ToString("yyyy-MM-ddTHH:mm:ss.fff")); } }
二、使用Newtonsoft.Json(手动引入场景)
若项目用Newtonsoft.Json替代默认序列化,可通过以下方式配置:
1. 全局配置
在Program.cs(或Startup.cs)中统一设置日期格式:
builder.Services.AddControllers() .AddNewtonsoftJson(options => { // 指定带毫秒的日期格式 options.SerializerSettings.DateFormatString = "yyyy-MM-ddTHH:mm:ss.fff"; });
2. 属性级别配置
在HappenedAt属性上直接指定格式:
public class Event { public Event(DateTime happenedAt) { HappenedAt = happenedAt; } [JsonConverter(typeof(IsoDateTimeConverter), "yyyy-MM-ddTHH:mm:ss.fff")] public DateTime HappenedAt { get; } }
额外注意
- 先确认你的
DateTime对象本身包含毫秒值:可通过dateTime.Millisecond属性验证,确保原始数据未丢失毫秒部分。 - 若使用
DateTimeOffset类型,默认序列化会保留毫秒,也可通过上述方法自定义输出格式。
内容的提问来源于stack exchange,提问作者user5405648
相关产品推荐
相关产品推荐

