Loz*_*ude 22 .net serialization datetime json.net
我已经使用旧版本的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#代码.
我只是想知道为什么这会改变.
谢谢...
你看到了哪些浏览器?因为您实际应对的问题是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'
Run Code Online (Sandbox Code Playgroud)
在大多数浏览器中,所有日期解析都很好 在IE9中,前3个失败,无论Z还是否,因为IE9需要3个位数作为毫秒数.第二个2成功,有和没有Z.重要的是3毫秒数字 - Z是无关紧要的,包括因为Javascript不包含类似.Net的DateTimeKind,所以Z或no与Javascript如何内化日期无关.因为毫秒位数有时会是1或2,具体取决于时间,如果你通过时间戳,你会得到随机看似的失败.
我已将此报告为Json.Net Codeplex页面上的错误 ; 它被错误的评论中的维护者解雇并关闭.去开源.
您可以使用此答案中的代码解决此错误:
要明确的是,如果JSON.Net没有为DateTimeKind.UTC而没有它,则缺少Z是不正确的,但它更普遍地不是无效的ISO-8601日期 - 没有Z隐含地意味着本地时间:
http://en.wikipedia.org/wiki/ISO_8601#Times
如果没有给出具有时间表示的UTC关系信息,则假定时间是在本地时间.
并且如上所述,Javascript的解析并不关心Z,所以出于您的目的,它并不重要.
另请注意,您可能实际上并未将UTC传递给JSON.Net并触发此问题.C#中的DateTime对象可以是Local,Unspecified或UTC.假设非UTC的DateTime实际上是UTC,这是不公平的; 没有时区信息传递是最安全的选择..Net DateTime结构在时区上发挥作用,因此JSON.Net别无选择,只能将默认的DateTimes(DateTimeKind.Unspecified)发布为Local,禁止与.Net TimeZone库集成.
| 归档时间: |
|
| 查看次数: |
23558 次 |
| 最近记录: |