缺少自定义DateTimeConverterBase
实现,是否有某种方法可以让 Json.NET 4.5+ 在设置为 use时为给定DateFormatHandling.MicrosoftDateFormat
的任何非 UTC 附加时区偏移量DateTime
?
"\/Date(1333645844276-0600)\/"
细节
我正在将一个 API 项目从使用内置 .NETJavaScriptSerializer
切换到使用 Json.NET 生成 JSON。在 Json.NET 中,对于 UTC DateTime
,默认的日期时间序列化类似于 .NET 版本:
"\/Date(1333645844276)\/"
对于非 UTC,与 不同JavaScriptSerializer
的是,Json.NET 会在结果中附加一个时区偏移量(我所在的地区为 -6,每年的这个时候):
"\/Date(1333645844276-0600)\/"
这是我用来将 Json.NET 4.5+ 切换回\/Date(...)\/
格式(称为MicrosoftDateFormat
)的代码:
JsonSerializerSettings customJsonSettings = new JsonSerializerSettings() {
DateFormatHandling = DateFormatHandling.MicrosoftDateFormat
};
string result = JsonConvert.SerializeObject(DateTime.Now, customJsonSettings);
该解决方案似乎就像告诉 Json.NET 使用不同的DateTimeZoneHandling
设置一样简单。我已经尝试了DateTimeZoneHandling
( Local
、Utc
、Unspecified
和RoundtripKind
) 的所有设置,它们都在输出中保持“-0600”。事实上,对于非 UTC ,它们都产生相同的结果DateTime
。
JsonSerializerSettings customJsonSettings = new JsonSerializerSettings() {
DateFormatHandling = DateFormatHandling.MicrosoftDateFormat,
DateTimeZoneHandling = DateTimeZoneHandling.Utc
};
string result = JsonConvert.SerializeObject(DateTime.Now, customJsonSettings);
"\/Date(1333647855743-0600)\/"
警告
理想情况下,我会在 UTC 度过我所有的时间。我当然打算在这个 API 的下一个版本中这样做。由于这是一个实时 API,因此在发布新版本之前不值得冒险更改输出。对于大多数 JSON 解析系统来说,这似乎不是问题,但我不能冒险改变,因为 JSON 标准没有正式说明日期序列化。