我一直在使用旧版本的JSON.Net(4.0r4)一段时间。刚刚更新到最新的(4.5r11)。我注意到日期的格式如下:
2013-03-20T09:00:00.119Z
但现在是:
2013-03-20T09:00:00.119
最后Z缺失了。根据维基百科:
如果时间是UTC,请在没有空格的时间后直接添加Z
这打破了很多我的JavaScript代码,因为我有一个方法可以将其转换为DateTime
对象&它期望Z
。我可以通过改变我用来做这个的功能来解决这个问题。我发现我可以
将DateTimeZoneHandling
设置为DateTimeZoneHandling.Utc
,但这意味着我必须在多个项目中更改大量C#代码。
我只是想知道为什么会发生这种变化。
...谢谢
答案 0 :(得分:6)
您认为这种情况发生在哪些浏览器中?因为您实际应对的问题是Javascript解析,根据我的经验,问题实际上是毫秒舍入,而不是Z的存在。
在IE9中尝试此操作:http://jsfiddle.net/b9chris/HaBP8/
'2013-06-13T20:43:55.6',
'2013-06-13T20:43:55.61',
'2013-06-13T20:43:55.61Z',
'2013-06-13T20:43:55.611',
'2013-06-13T20:43:55.611Z'
在大多数浏览器中,所有日期都解析得很好;在IE9中,前3个失败,无论Z还是否,因为IE9需要3个位数作为毫秒数。第二个2成功,有和没有Z.重要的是3毫秒数字 - Z是无关紧要的,包括因为Javascript不包含类似.Net的DateTimeKind,所以Z或no与Javascript如何内化日期无关。因为毫秒位数有时会是1或2,具体取决于时间,如果你通过时间戳,你会得到随机看似的失败。
I've reported this as a bug on the Json.Net Codeplex page;它被错误的评论中的维护者解雇并关闭。开源。
您可以使用此答案中的代码解决此错误:
https://stackoverflow.com/a/15939945/176877
要明确的是,如果JSON.Net没有为DateTimeKind.UTC而没有它,那么缺少Z是不正确的,但它通常不是无效的ISO-8601日期 - 没有Z隐含地意味着本地时间:< / p>
http://en.wikipedia.org/wiki/ISO_8601#Times
如果没有给出时间表示的UTC关系信息,则假定时间是当地时间。
如上所述,Javascript的解析并不关心Z,所以出于您的目的,它并不重要。
另请注意,您可能实际上并未将UTC传递给JSON.Net并触发此问题。 C#中的DateTime对象可以是Local, Unspecified, or UTC种类。假设非UTC的DateTime实际上是UTC,这是不公平的;没有时区信息传递是最安全的选择。 .Net DateTime结构在时区上发挥作用,因此JSON.Net别无选择,只能将默认的DateTimes(DateTimeKind.Unspecified)发布为Local,禁止与.Net TimeZone library集成。
答案 1 :(得分:4)
您可以更改DateTime的序列化方式,请从JSON.NET作者查看:Good (Date)Times with Json.NET
答案 2 :(得分:3)
如果您在服务器上有UTC数据,则应明确设置DateTimeZoneHandling属性
//serializer fix
config.Formatters.Clear();
config.Formatters.Add(new JsonMediaTypeFormatter()
{
SerializerSettings = new JsonSerializerSettings() {
ContractResolver=new CamelCasePropertyNamesContractResolver(),
DateTimeZoneHandling = DateTimeZoneHandling.Utc},
});
此DateTime在结尾处有“Z”:2017-05-11T00:35:20.8242381 Z