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

pat*_*dge 20 json.net

DateTimeConverterBase缺少自定义实现,是否有一些方法可以保留Json.NET 4.5+,当设置为使用时DateFormatHandling.MicrosoftDateFormat,为任何非UTC提供时区偏移量DateTime

"\/Date(1333645844276-0600)\/"
Run Code Online (Sandbox Code Playgroud)

细节

我正在将API项目从使用内置.NET转换JavaScriptSerializer为使用Json.NET生成JSON.在Json.NET中,对于UTC DateTime,默认的日期时间序列化类似于.NET版本:

"\/Date(1333645844276)\/"
Run Code Online (Sandbox Code Playgroud)

对于非UTC,不像JavaScriptSerializer,Json.NET在结果中附加时区偏移量(对于我的区域,每年的这个时间为-6):

"\/Date(1333645844276-0600)\/"
Run Code Online (Sandbox Code Playgroud)

这是我用来将Json.NET 4.5+切换回\/Date(...)\/格式(称为MicrosoftDateFormat)的代码:

JsonSerializerSettings customJsonSettings = new JsonSerializerSettings() {
    DateFormatHandling = DateFormatHandling.MicrosoftDateFormat
};
string result = JsonConvert.SerializeObject(DateTime.Now, customJsonSettings);
Run Code Online (Sandbox Code Playgroud)

解决方案似乎就像告诉Json.NET使用不同的DateTimeZoneHandling设置一样简单.我已经想尽设置为DateTimeZoneHandling(Local,Utc,UnspecifiedRoundtripKind),他们都保持"-0600"的输出.事实上,它们都为非UTC产生相同的结果DateTime.

JsonSerializerSettings customJsonSettings = new JsonSerializerSettings() {
    DateFormatHandling = DateFormatHandling.MicrosoftDateFormat,
    DateTimeZoneHandling = DateTimeZoneHandling.Utc
};
string result = JsonConvert.SerializeObject(DateTime.Now, customJsonSettings);
"\/Date(1333647855743-0600)\/"
Run Code Online (Sandbox Code Playgroud)

警告

理想情况下,我已经拥有UTC的所有时间.我当然计划使用此API的下一个版本.由于这是一个实时API,因此在发布新版本之前,不值得冒输出更改.对于大多数JSON解析系统来说,它似乎不是一个问题,但我不能冒这个改变的风险,因为JSON标准没有正式说明日期序列化.

joh*_*ohv 11

对我来说似乎工作得很好,见下文.我的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)\/"
Run Code Online (Sandbox Code Playgroud)

也许这是一个已修复的错误?

明确创建日期:

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)\/"}
Run Code Online (Sandbox Code Playgroud)

  • 证实.我有同样的问题.有JSON.NET 4.5.7,更新到4.5.8现在它正确地反序列化日期时间. (2认同)

小智 5

我找到了一个解决方案来删除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"};
Run Code Online (Sandbox Code Playgroud)