为什么IE / FF和Chrome javascript引擎differ on how to interpret这个日期格式(YYYY-MM-DDTHH:mm:ss.fff)没有时区指示符?
new Date("2015-02-18T15:43:57.803").getUTCHours()
UTC时间
Chrome: 15
IE11/FF: 21
我不明白这是因为Chrome认为它是本地的,而IE / FF则认为它是UTC?这似乎是一个Chrome错误.
有趣的是 – 在字符串的末尾附加一个“Z”告诉Chrome和IE / FF时间是UTC,他们可以同意.有没有人注意到这个javascript实现与Date的差异?
new Date("2015-02-18T15:43:57.803Z").getUTCHours()
UTC时间
Chrome: 15
IE11/FF: 15
最终 – 这是out-of-box serializer for ASP.NET Web API的结果,我认为它使用的是JSON.NET,但现在似乎是JSON.NET使用IsoDateTimeConverter
的内部.
检查GlobalConfiguration.Configuration.Formatters.JsonFormatter告诉我我们正在使用JsonMediaTypeFormatter
. Web API是不是开箱即用的JSON.NET序列化程序?
这对于Web API人来说是一个福音 – 至少在ASP.NET MVC中我们通过JavascriptSerializer
获得了一致的日期格式(尽管是专有的 – /日期(滴答数)/)
解决方法:
ES5表示没有时区的ISO 8601格式日期应视为本地(解释has since been revised),但ed. 6 draft表示将它们视为UTC.一些脚本引擎已经实现了ed. 6,一些ES5和其余的都没有.
编辑. 6(及更高版本)与ISO 8601规范不一致.
底线是不使用Date.parse(或将字符串传递给Date构造函数),手动解析日期字符串.