ISO 8601日期JS解释差异 - IE / FF与Chrome

时间:2015-02-19 22:29:46

标签: javascript google-chrome internet-explorer asp.net-web-api isodate

为什么没有时区的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

2 个答案:

答案 0 :(得分:4)

ES5表示没有时区的ISO 8601格式日期应视为本地(解释has since been revised),但ed. 6 draft表示将其视为UTC。一些脚本引擎已经实现了ed。 6,有些ES5,其余的都没有。

编辑。 6(及更高版本)与ISO 8601规范不一致。

底线是不使用 Date.parse (或将字符串传递给Date构造函数),手动解析日期字符串。

答案 1 :(得分:2)

对我们来说,问题的关键在于DateTimeStyles.RoundtripKind仅在DateTime属性设置DateTime.DateTimeKindDateTimeKind.Unspecified以外 - 默认< / em>)或更好 - 使用DateTimeOffset enforces use of the TimeZone specificity

由于我们已经拥有DateTime类属性,我们现在通过将DateTimeZoneHandling.RoundtripKind {(1>}}( DateTime默认)分配到{{1}来解决此问题。在我们的DateTimeZoneHandling.Utc中。这种变化基本上附加了&#34; Z&#34;到Global.asax.cs的末尾 - 但是还有一个步骤将本地时间转换为UTC。

第二步是通过分配JsonSerializerSettings.DateTimeZoneHandling来提供偏移量,JSON.NET IsoDateTimeConverter.DateTimeStyles将从DateTime中提取并自动从本地时间转换为UTC - 就像外出时一样开箱即用的ASP.NET MVC。

显然 - 还有其他选择,但这是我们的解决方案。

的Global.asax.cs

SerializerSettings.Converters

JsonSerializer - 默认为protected void Application_Start() { GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings.DateTimeZoneHandling = Newtonsoft.Json.DateTimeZoneHandling.Utc; GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings.Converters.Add(new IsoDateTimeConverter() { DateTimeStyles = DateTimeStyles.AdjustToUniversal }); } 。我们希望将其显式转换为UTC - Unspecified以前为我们提供的ASP.NET MVC开箱即用。 JavaScriptSerializer DateTimeStyles.AdjustToUniversal DateTime将您的本地{{1}}转换为UTC。