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

.NET5与Xamarin Android微软格式JSON DateTime反序列化差异问题

异常原因

1. 核心是运行环境的夏令时规则差异

你遇到的部分日期偏移问题,本质是Xamarin Android与.NET 5运行环境的时区数据库、历史夏令时判定规则不一致导致的:

  • 第三方返回的/Date(时间戳-0000)/格式中,-0000代表该时间戳为UTC时间,Json.NET默认反序列化时会自动把UTC时间转换为运行环境的本地时间。
  • 1975年10月11日刚好是大量地区(如欧洲各国)的夏令时切换节点,不同时区数据库对该历史日期的夏令时生效判定存在偏差,就出现了1小时的偏移,导致日期退回到前一天;而1983年7月19日处于夏令时稳定生效周期,没有切换动作,所以两边转换结果一致。

2. Xamarin时区库的特殊性

Xamarin Android直接调用Android系统自带的时区数据库(tzdata),而.NET 5控制台使用的是Windows系统或.NET runtime自带的时区数据库,两者对早年历史日期的夏令时规则记录存在差异,这就是为什么只在部分日期上出现问题。

3. 现有配置不生效的原因

你添加的DateFormatHandling = DateFormatHandling.MicrosoftDateFormat仅指定了兼容微软日期格式的解析规则,没有改变反序列化时自动转本地时间的逻辑,所以无法解决偏移问题。

修复方案

你可以根据业务需求选择以下任意一种方案:

  • 方案1:强制保留UTC时间,关闭本地时区转换
    调整反序列化配置即可统一两边结果:
    JsonSerializerSettings settings = new JsonSerializerSettings
    {
        DateFormatHandling = DateFormatHandling.MicrosoftDateFormat,
        DateTimeZoneHandling = DateTimeZoneHandling.Utc
    };
    var user = JsonConvert.DeserializeObject<User>(contentResp, settings);
    
    解析后得到的DateTime的Kind属性为Utc,不会做本地时区转换,两边运行结果完全一致。
  • 方案2:统一时区规则
    如果业务需要使用本地时间,可以引入NodaTime类库,使用统一版本的时区数据库做时间转换,规避运行环境自带时区库的差异问题。
  • 方案3:纯日期场景规避转换
    如果BirthDate仅需要存储日期、不需要时间精度,可以将对应属性的类型改为string,自行截取解析日期部分,完全避开时区转换逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.16 08:54:01