首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在使用MicrosoftDateFormat时防止Json.NET 4.5追加时区偏移

在使用MicrosoftDateFormat时防止Json.NET 4.5追加时区偏移
EN

Stack Overflow用户
提问于 2012-04-06 02:03:15
回答 2查看 11.6K关注 0票数 21

除了自定义DateTimeConverterBase实现之外,有没有办法防止Json.NET 4.5+在设置为使用DateFormatHandling.MicrosoftDateFormat时,为它提供的任何非UTC DateTime附加时区偏移量?

代码语言:javascript
复制
"\/Date(1333645844276-0600)\/"

详细信息

我正在将一个应用编程接口项目从使用内置的JSON JavaScriptSerializer切换到使用Json.NET来生成.NET。在Json.NET中,对于UTC DateTime,默认的datetime序列化类似于.NET版本:

代码语言:javascript
复制
"\/Date(1333645844276)\/"

对于非协调世界时,与JavaScriptSerializer不同,Json.NET将时区偏移量附加到结果中(对于我所在的地区,每年的这个时候为-6):

代码语言:javascript
复制
"\/Date(1333645844276-0600)\/"

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

代码语言:javascript
复制
JsonSerializerSettings customJsonSettings = new JsonSerializerSettings() {
    DateFormatHandling = DateFormatHandling.MicrosoftDateFormat
};
string result = JsonConvert.SerializeObject(DateTime.Now, customJsonSettings);

解决方案看起来就像告诉Json.NET使用不同的DateTimeZoneHandling设置一样简单。我尝试了DateTimeZoneHandling的每种设置(LocalUtcUnspecifiedRoundtripKind),它们都在输出中保留了"-0600“。事实上,对于非UTC DateTime,它们都会产生相同的结果。

代码语言:javascript
复制
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标准并没有正式规定任何关于日期序列化的内容。

EN

回答 2

Stack Overflow用户

发布于 2012-08-06 18:40:10

它对我来说似乎工作得很好,如下所示。我的JSON.NET程序集说它的版本是"4.5.0.0“。

代码语言:javascript
复制
JsonSerializerSettings customJsonSettings = new JsonSerializerSettings()
{
    DateFormatHandling = DateFormatHandling.MicrosoftDateFormat,
    DateTimeZoneHandling = DateTimeZoneHandling.Utc
};
string result = JsonConvert.SerializeObject(DateTime.Now, customJsonSettings);
Console.WriteLine(result); // "\/Date(1344249339881)\/"

也许这是一个已经修复的bug?

显式创建日期:

代码语言:javascript
复制
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)\/"}
票数 13
EN

Stack Overflow用户

发布于 2016-12-15 22:43:19

我找到了一个解决方案,可以从最新版本9.0.0的DateTime中删除时区偏移:

代码语言:javascript
复制
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"};
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10033612

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档