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

C# JSON反序列化后日期格式变更:如何保留原UTC格式

如何保留UTC时间的原序列化格式(带7位小数和Z后缀)

现有BuildJson<T>方法,接收JSON字符串后先反序列化再重新序列化。原始JSON中的StatusDateTimeUTC字段格式为"2020-11-15T11:37:08.0000000Z",但经过反序列化再序列化后,格式变为"2020-11-15T11:37:08+00:00",希望保留原UTC格式。尝试在反序列化时设置DateTimeZoneHandling.Utc或结合MicrosoftDateFormat均未生效。


原始代码参考

原始JSON:

string body = "{   \"IdentityNumber\" :660045,\r\n \"ResolutionStatusId\" :3,\r\n \"StatusDateTimeUTC\" :\"2020-11-15T11:37:08.0000000Z\",\r\n \"OutcomeId\" :3}";

原始BuildJson方法:

private string BuildJson<T>(string body, string operation)
{
   AMSDto<T> aMSDto = new AMSDto<T>();
   aMSDto.Body = JsonConvert.DeserializeObject<T>(body);
           
   NistMapping.AddHeaders<T>(aMSDto, operation);
   return JsonConvert.SerializeObject(aMSDto);
}

尝试过的无效配置(仅作用于反序列化环节):

// 配置1
aMSDto.Body = JsonConvert.DeserializeObject<T>(body, new JsonSerializerSettings
{
      DateTimeZoneHandling = DateTimeZoneHandling.Utc
});

// 配置2
var microsoftDateFormatSettings = new JsonSerializerSettings
{
    DateFormatHandling = DateFormatHandling.MicrosoftDateFormat,
    DateTimeZoneHandling = DateTimeZoneHandling.Utc
};
aMSDto.Body = JsonConvert.DeserializeObject<T>(body, microsoftDateFormatSettings);

问题根源

反序列化时DateTime对象已经正确解析为UTC时间,但序列化环节的默认格式与原始格式不符,之前的配置仅作用于反序列化,未影响最终的序列化输出。

正确配置方案

在调用JsonConvert.SerializeObject时,传入自定义的序列化配置,指定日期格式为yyyy-MM-dd'T'HH:mm:ss.fffffff'Z'(匹配原始的7位小数+Z后缀格式),同时确保时区处理为UTC:

修改后的BuildJson方法:

private string BuildJson<T>(string body, string operation)
{
   AMSDto<T> aMSDto = new AMSDto<T>();
   // 反序列化无需特殊配置,默认即可正确解析UTC时间
   aMSDto.Body = JsonConvert.DeserializeObject<T>(body);
           
   NistMapping.AddHeaders<T>(aMSDto, operation);
   
   // 序列化时指定格式配置
   var serializeSettings = new JsonSerializerSettings
   {
       DateTimeZoneHandling = DateTimeZoneHandling.Utc,
       DateFormatString = "yyyy-MM-dd'T'HH:mm:ss.fffffff'Z'"
   };
   return JsonConvert.SerializeObject(aMSDto, serializeSettings);
}

配置说明

  • DateTimeZoneHandling.Utc:确保序列化时将DateTime对象以UTC时区输出
  • DateFormatString = "yyyy-MM-dd'T'HH:mm:ss.fffffff'Z'":强制输出7位小数的秒数,并且固定后缀为Z,完全匹配原始格式

如果需要全局生效该配置,可设置默认序列化规则:

JsonConvert.DefaultSettings = () => new JsonSerializerSettings
{
    DateTimeZoneHandling = DateTimeZoneHandling.Utc,
    DateFormatString = "yyyy-MM-dd'T'HH:mm:ss.fffffff'Z'"
};

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 22:56:29