如何防止Json.NET 4.5在使用MicrosoftDateFormat时添加时区偏移量?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (19)

自定义DateTimeConverterBase实现的缺失,是否有某种方法可以让Json.NET 4.5+在设置为使用DateFormatHandling.MicrosoftDateFormat时为附加任何非UTC的时区偏移量DateTime提供帮助?

"\/Date(1333645844276-0600)\/"

细节

我正在使用内置.NET JavaScriptSerializer将API项目切换为使用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设置一样简单。我已经想尽设置为DateTimeZoneHandlingLocalUtcUnspecifiedRoundtripKind),他们都保持“-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标准没有正式说出有关日期序列化的任何内容。

提问于
用户回答回答于

我发现了一个解决方案来删除DateTime最新版本9.0.0的时区偏移:

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"};
用户回答回答于

它似乎对我来说很好,见下文。我的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)\/"}

扫码关注云+社区