如何使用Newtonsoft Json将DateTimeOffset值序列化为UTC格式
关于Newtonsoft Json序列化DateTimeOffset为UTC格式的解决方案
你当前配置无法生效的核心原因是 DateTimeZoneHandling 配置仅对 DateTime 类型生效,Newtonsoft Json默认序列化DateTimeOffset类型时会保留其自带的时区偏移量,不会主动转换为UTC时间。
解决方案:自定义DateTimeOffset序列化转换器
通过实现自定义JsonConverter,强制所有DateTimeOffset类型在序列化时先转换为UTC时间再输出,同时支持全局配置适配WebAPI场景。
1. 实现自定义转换器
public class DateTimeOffsetToUtcConverter : JsonConverter<DateTimeOffset> { public override void WriteJson(JsonWriter writer, DateTimeOffset value, JsonSerializer serializer) { // 序列化时统一转换为UTC时间输出 writer.WriteValue(value.UtcDateTime); } public override DateTimeOffset ReadJson(JsonReader reader, Type objectType, DateTimeOffset existingValue, bool hasExistingValue, JsonSerializer serializer) { // 反序列化逻辑可根据需求调整,以下为通用实现,自动转UTC return reader.Value switch { DateTime dt => new DateTimeOffset(dt).ToUniversalTime(), DateTimeOffset dto => dto.ToUniversalTime(), string s => DateTimeOffset.Parse(s).ToUniversalTime(), _ => throw new JsonSerializationException("无法解析为有效的DateTimeOffset类型") }; } }
2. .NET 5.0 WebAPI全局配置
在Startup.cs的ConfigureServices方法中添加如下配置,即可全局生效:
services.AddControllers() .AddNewtonsoftJson(options => { // 注入自定义转换器 options.SerializerSettings.Converters.Add(new DateTimeOffsetToUtcConverter()); // 保留你原有配置 options.SerializerSettings.DateParseHandling = DateParseHandling.DateTimeOffset; options.SerializerSettings.DateTimeZoneHandling = DateTimeZoneHandling.Utc; options.SerializerSettings.DateFormatHandling = DateFormatHandling.IsoDateFormat; });
3. 单独序列化场景使用
如果是单独调用JsonConvert.SerializeObject的场景,直接把转换器添加到设置的Converters集合即可:
var settings = new JsonSerializerSettings { DateParseHandling = DateParseHandling.DateTimeOffset, DateTimeZoneHandling = DateTimeZoneHandling.Utc, DateFormatHandling = DateFormatHandling.IsoDateFormat, Converters = { new DateTimeOffsetToUtcConverter() } }; // 测试代码 var datetimeoffsetlocalNow = DateTimeOffset.Now; var datetimeoffsetstring = JsonConvert.SerializeObject(datetimeoffsetlocalNow, settings); // 输出将为带Z后缀的UTC时间格式,例如"2024-05-20T12:34:56Z" Console.WriteLine(datetimeoffsetstring);
内容的提问来源于stack exchange,提问作者csharpdev
相关产品推荐
相关产品推荐

