为什么没有时区的IE / FF和Chrome javascript引擎differ on how to interpret此日期格式( YYYY-MM-DDTHH:mm:ss.fff )指示符?
new Date("2015-02-18T15:43:57.803").getUTCHours()
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()
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
答案 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.DateTimeKind
(除DateTimeKind.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。
显然 - 还有其他选择,但这是我们的解决方案。
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。