防止 Json.NET 4.5 在使用 MicrosoftDateFormat 时附加时区偏移量



缺少自定义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的所有设置(LocalUtcUnspecifiedRoundtripKind),它们在输出中都保持"-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"};

相关内容

  • 没有找到相关文章

最新更新