【问题标题】:Ignore UTC offsets when deserializing with Json.NET使用 Json.NET 反序列化时忽略 UTC 偏移量
【发布时间】:2026-01-05 00:15:01
【问题描述】:

我使用 ASP.NET Web API 2 编写了一个 REST 端点,它接收日期。后端系统没有UTC时间或DST的概念,数据库中存储的日期只是英国的日期和时间。

但是,提供端点的网站在发送到端点的数据中包含 UTC 偏移值(例如,日期看起来像“1939-01-08T00:00:00+01:00”)。当在冬季输入夏季日期时会发生这种情况,反之亦然(由于 DST 的调整)。

我是否可以将 JSON 反序列化器设置为完全忽略那些 UTC 偏移值?我查看了文档 here 和示例 here 并尝试了所有不同的枚举选项,但它们都没有给我我正在寻找的行为。

【问题讨论】:

    标签: json.net asp.net-web-api2


    【解决方案1】:

    如果日期解析没有按照您想要的方式工作,您可以将其关闭并使用自定义 JsonConverter 来处理日期。

    这是一个可以完成这项工作的转换器:

    class OffsetIgnoringDateConverter : JsonConverter
    {
        public override bool CanConvert(Type objectType)
        {
            return (objectType == typeof(DateTime) || objectType == typeof(DateTime?));
        }
    
        public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
        {
            string rawDate = (string)reader.Value;
            if (rawDate == null) return existingValue;
            if (rawDate.Length > 19) rawDate = rawDate.Substring(0, 19);
            DateTime date = DateTime.ParseExact(rawDate, "yyyy'-'MM'-'dd'T'HH':'mm':'ss", 
                                     CultureInfo.CurrentCulture, DateTimeStyles.AssumeLocal);
            return date;
        }
    
        public override bool CanWrite
        {
            get { return false; }
        }
    
        public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
        {
            throw new NotImplementedException();
        }
    }
    

    要将此转换器安装到 Web API 管道中,请将以下内容添加到 Global.asax 中的 Application_Start() 方法中:

    var config = GlobalConfiguration.Configuration;
    var jsonSettings = config.Formatters.JsonFormatter.SerializerSettings;
    jsonSettings.DateParseHandling = DateParseHandling.None;
    jsonSettings.Converters.Add(new OffsetIgnoringDateConverter());
    

    这是一个演示(控制台应用):https://dotnetfiddle.net/kt9pFl

    【讨论】: