缺少自定义DateTimeConverterBase
实现,有没有办法防止 Json.NET 4.5+,当设置为使用DateFormatHandling.MicrosoftDateFormat
时,不会在给定DateTime
附加任何非UTC的时区偏移量?
"/Date(1333645844276-0600)/"
详
我正在将 API 项目从使用内置的 .NET JavaScriptSerializer
切换到使用 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 标准没有正式说明日期序列化。
它似乎对我来说很好用,见下文。我的 JSON.NET 程序集显示它是版本"4.5.0.0"。
JsonSerializerSettings customJsonSettings = new JsonSerializerSettings()
{
DateFormatHandling = DateFormatHandling.MicrosoftDateFormat,
DateTimeZoneHandling = DateTimeZoneHandling.Utc
};
string result = JsonConvert.SerializeObject(DateTime.Now, customJsonSettings);
Console.WriteLine(result); // "/Date(1344249339881)/"
也许这是一个已修复的错误?
显式创建日期:
var x = new { thedate = new DateTime(2009, 2, 15, 0, 0, 0, DateTimeKind.Local) };
Console.WriteLine(JsonConvert.SerializeObject(x,
new JsonSerializerSettings() {
DateFormatHandling = DateFormatHandling.MicrosoftDateFormat
}));
// {"thedate":"/Date(1234652400000+0100)/"}
Console.WriteLine(JsonConvert.SerializeObject(x,
new JsonSerializerSettings() {
DateFormatHandling = DateFormatHandling.MicrosoftDateFormat,
DateTimeZoneHandling = Newtonsoft.Json.DateTimeZoneHandling.Utc
}));
// {"thedate":"/Date(1234652400000)/"}
Console.WriteLine(JsonConvert.SerializeObject(x,
new JsonSerializerSettings() {
DateFormatHandling = DateFormatHandling.MicrosoftDateFormat,
DateTimeZoneHandling = Newtonsoft.Json.DateTimeZoneHandling.Local
}));
// {"thedate":"/Date(1234652400000+0100)/"}
>我找到了一种解决方案,可以从最新版本 9.0.0 的DateTime
中删除时区偏移量:
var time = DateTime.Now;
Console.WriteLine(JsonConvert.SerializeObject(time, new JsonSerializerSettings()
{
DateFormatHandling = DateFormatHandling.IsoDateFormat,
DateTimeZoneHandling = Newtonsoft.Json.DateTimeZoneHandling.Unspecified
}));
//"{"thedate": "2016-12-15T09:20:00.9375403"};