You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.NET Core 2.1:JsonConvert反序列化DateTimeOffset为DateTime时忽略时区转换

.NET Core 2.1:反序列化带时区的日期字符串到DateTime时忽略时区转换

问题场景

执行以下代码获取本地时区的DateTimeOffset:

Console.WriteLine(DateTimeOffset.Now);

返回结果示例:7/25/2023 6:32:37 PM +02:00(本地时间+时区偏移量)。

在将带时区的日期字符串反序列化为DateTime类型时,出现了时区自动转换的问题:

  • 当输入字符串为"2023-07-25T18:32:37+02:00"时,反序列化结果符合预期(7/25/2023 6:32:37 PM);
  • 当输入字符串为"2023-07-25T18:32:37+00:00"时,结果被自动转换为本地时区时间7/25/2023 8:32:37 PM,而期望保留原字符串中的18:32:37时分秒,不进行时区转换。

测试代码如下:

class Test
{
    public DateTime departure;
}

class Program
{
    static void Main(string[] args)
    {
        var testObj = JsonConvert.DeserializeObject<Test>(
            "{\"departure\":\"2023-07-25T18:32:37+00:00\"}",
            new JsonSerializerSettings()
            {
                DateTimeZoneHandling = DateTimeZoneHandling.Unspecified,
                DateParseHandling = DateParseHandling.None
            });

        Console.WriteLine(testObj.departure);
        // 输出:7/25/2023 8:32:37 PM(不符合预期)
    }
}

解决方案

自定义Json转换器忽略时区转换

通过实现自定义JsonConverter,直接提取日期字符串中的原始时分秒信息,跳过时区转换逻辑:

  1. 定义自定义转换器:
public class IgnoreTimezoneDateTimeConverter : JsonConverter<DateTime>
{
    public override DateTime ReadJson(JsonReader reader, Type objectType, DateTime existingValue, bool hasExistingValue, JsonSerializer serializer)
    {
        if (reader.Value is string dateStr && DateTimeOffset.TryParse(dateStr, out var dto))
        {
            // 返回原始时间值,Kind标记为Unspecified
            return dto.DateTime;
        }
        // 兼容其他日期格式的 fallback 处理
        return serializer.Deserialize<DateTime>(reader);
    }

    public override void WriteJson(JsonWriter writer, DateTime value, JsonSerializer serializer)
    {
        serializer.Serialize(writer, value);
    }
}
  1. 在反序列化时使用该转换器:
var testObj = JsonConvert.DeserializeObject<Test>(
    "{\"departure\":\"2023-07-25T18:32:37+00:00\"}",
    new JsonSerializerSettings()
    {
        Converters = new List<JsonConverter> { new IgnoreTimezoneDateTimeConverter() }
    });

Console.WriteLine(testObj.departure);
// 输出:7/25/2023 6:32:37 PM(符合预期)

原配置失效原因说明

  • DateParseHandling.None:该配置仅会让Json.NET不自动将日期字符串解析为日期类型,但由于目标字段是DateTime,框架仍会强制解析,因此无法生效。
  • DateTimeZoneHandling.Unspecified:该配置会将带时区的日期转换为本地时区时间,再将DateTime.Kind标记为Unspecified,因此会出现时区转换的问题。

内容的提问来源于stack exchange,提问作者jasmin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 08:53:29