21

缺少自定义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( 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 标准没有正式说明日期序列化。

4

2 回答 2

13

它对我来说似乎工作得很好,见下文。我的 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)\/"}
于 2012-08-06T10:40:10.450 回答
4

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"};
于 2016-12-15T14:43:19.423 回答