2

为什么 IE/FF 和 Chrome javascript 引擎在没有时区指示符的情况下如何解释这种日期格式YYYY-MM-DDTHH:mm:ss.fff)有所不同?

new Date("2015-02-18T15:43:57.803").getUTCHours()

UTC 时间

铬: 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 时间

铬: 15
IE11/FF: 15

最终 - 这是ASP.NET Web API 的开箱即用序列化程序的结果,我认为它使用 JSON.NET,但现在似乎是 JSON.NET 使用的内部IsoDateTimeConverter

检查GlobalConfiguration.Configuration.Formatters.JsonFormatter告诉我我们正在使用JsonMediaTypeFormatter. Web API 是否没有使用开箱即用的 JSON.NET 序列化程序?

这对 Web API 人员来说是一个福音——至少在 ASP.NET MVC 中,我们通过JavascriptSerializer

4

2 回答 2

4

ES5表示没有时区的 ISO 8601 格式日期应视为本地日期(该解释已被修订),但ed. 6 草案说将它们视为 UTC。一些脚本引擎已经实现了 ed。6、一些 ES5 和其余的都没有。

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

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

于 2015-02-19T22:59:18.853 回答
2

对我们来说,这个问题的症结在于,DateTimeStyles.RoundtripKind只有当您的DateTime属性设置了DateTime.DateTimeKind默认值除外DateTimeKind.Unspecified)或更好的情况下才有效 - 使用DateTimeOffset强制使用TimeZone特异性

因为我们已经有了属性DateTime,所以我们现在通过在JsonSerializerSettings.DateTimeZoneHandling我们的. 此更改实质上将“Z”附加到末尾- 但是还有一个步骤可以将本地时间转换为 UTC。DateTimeZoneHandling.RoundtripKindDateTimeZoneHandling.UtcGlobal.asax.csDateTime

第二步是通过指定IsoDateTimeConverter.DateTimeStyles哪个 JSON.NETJsonSerializer将从 a 拾取SerializerSettings.Converters并自动从本地时间转换为 UTC 来提供偏移量——就像开箱即用的 ASP.NET MVC 所做的那样。

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

全球.asax.cs

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 });
}

这样做的原因是因为RoundtripKind尊重 DateTime 的DateTimeKind-Unspecified默认情况下。我们希望将其显式转换为 UTC——这JavaScriptSerializer在 ASP.NET MVC 中为我们提供了开箱即用的功能。区域偏移量DateTimeStyles.AdjustToUniversal它将您的本地转换为DateTimeUTC 提供。

于 2015-02-20T21:39:41.290 回答