如何使用数据注解格式化C#中的DateTimeOffset属性?
解决DateTimeOffset在API JSON响应中的格式化问题
针对你需要在保留DateTimeOffset类型用于程序内计算的同时,让API返回指定格式(如2011-01-25T11:53:22.010Z)JSON的需求,可根据你使用的JSON序列化库选择以下方案:
一、使用System.Text.Json(.NET Core 3.0+ 默认序列化库)
通过自定义JsonConverter并配合数据注解[JsonConverter]实现格式控制:
1. 自定义DateTimeOffset转换器
using System; using System.Globalization; using System.Text.Json; using System.Text.Json.Serialization; public class DateTimeOffsetUtcZConverter : JsonConverter<DateTimeOffset> { // 目标格式:包含三位毫秒 + UTC标识Z private const string TargetFormat = "yyyy-MM-dd'T'HH:mm:ss.fffZ"; public override DateTimeOffset Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { // 反序列化时解析目标格式的字符串 return DateTimeOffset.ParseExact(reader.GetString(), TargetFormat, CultureInfo.InvariantCulture); } public override void Write(Utf8JsonWriter writer, DateTimeOffset value, JsonSerializerOptions options) { // 序列化时转为UTC时间并按目标格式输出 writer.WriteStringValue(value.UtcDateTime.ToString(TargetFormat, CultureInfo.InvariantCulture)); } }
2. 在属性上添加数据注解
直接在需要格式化的DateTimeOffset属性上标记转换器:
[JsonConverter(typeof(DateTimeOffsetUtcZConverter))] public DateTimeOffset Time1 { get; set; } [JsonConverter(typeof(DateTimeOffsetUtcZConverter))] public DateTimeOffset Time2 { get; set; }
可选:全局配置(无需逐个属性加注解)
如果所有DateTimeOffset属性都需要统一格式,可在Startup/Program.cs中全局配置:
builder.Services.AddControllers() .AddJsonOptions(options => { options.JsonSerializerOptions.Converters.Add(new DateTimeOffsetUtcZConverter()); });
二、使用Newtonsoft.Json(Json.NET)
若项目使用Newtonsoft.Json,可结合[JsonConverter]注解和内置转换器实现:
1. 直接使用内置IsoDateTimeConverter
using Newtonsoft.Json; using Newtonsoft.Json.Converters; [JsonConverter(typeof(IsoDateTimeConverter))] public DateTimeOffset Time1 { get; set; } [JsonConverter(typeof(IsoDateTimeConverter))] public DateTimeOffset Time2 { get; set; }
然后在全局配置中指定格式:
var jsonSettings = new JsonSerializerSettings { Converters = new List<JsonConverter> { new IsoDateTimeConverter { DateTimeFormat = "yyyy-MM-dd'T'HH:mm:ss.fffZ", DateTimeStyles = DateTimeStyles.AdjustToUniversal } } }; // ASP.NET中全局配置方式 builder.Services.AddControllers() .AddNewtonsoftJson(options => { options.SerializerSettings.Converters.Add(new IsoDateTimeConverter { DateTimeFormat = "yyyy-MM-dd'T'HH:mm:ss.fffZ", DateTimeStyles = DateTimeStyles.AdjustToUniversal }); });
以上方案均保留了DateTimeOffset的类型特性,不影响程序内的日期计算逻辑,仅在JSON序列化/反序列化阶段处理格式转换。
内容的提问来源于stack exchange,提问作者EBDS
相关产品推荐
相关产品推荐

