gpt4 book ai didi

javascript - Chrome 将不带 Z 的 ISO 时间解释为 UTC; C#问题

转载 作者:可可西里 更新时间:2023-11-01 02:33:46 63 4
gpt4 key购买 nike

运行这个 jsfiddle:http://jsfiddle.net/E9gq9/7/在 Chrome、FF 和 IE 上你会得到:

Chrome :

Chrome http://images.devs-on.net/Image/vBTz86J0f4o8zlL3-Region.png

火狐:

Firefox http://images.devs-on.net/Image/aNPxNPUpltyjVpSX-Region.png

即:

IE http://images.devs-on.net/Image/WXLM5Ev1Viq4ecFq-Region.png

Safari :

Safari http://images.devs-on.net/Image/AEcyUouX04k2yIPo-Region.png

ISO 8601似乎没有说明应该如何解释没有尾随 Z 的字符串。

我们的服务器 (ASP.NET MVC4) 将 UTC 时间作为 DateTime 从我们的数据库中提取出来,并简单地将它们填充到 JSON 中。正如您所见,我们在浏览器上得到的结果不一致。

我们应该在服务器端将 Z 附加到它们吗?

最佳答案

Should we just append Z to them on the server side?

TL;DR 是的,您可能应该这样做。

不幸的是,多年来,正确处理日期和不带时区的日期/时间的方式有所不同——无论是在规范还是 JavaScript 引擎对规范的遵守方面。

当这个答案最初写于 2013 年时,ES5规范(第一个为 JavaScript 定义了日期/时间格式,这意味着是 ISO-8601 的子集)很明确:No timezone = UTC:

The value of an absent time zone offset is “Z”.

但这与 ISO-8601 不一致,其中缺少时区指示符表示“本地时间”。一些实现从未实现 ES5 的含义,而是坚持 ISO-8601。

ES2015 (又名“ES6”),它被更改为匹配 ISO-8601:

If the time zone offset is absent, the date-time is interpreted as a local time.

但是,这导致了与现有代码的不兼容问题,尤其是对于像 2018-07-01 这样的纯日期形式,所以在 ES2016 中它又被改变了:

When the time zone offset is absent, date-only forms are interpreted as a UTC time and date-time forms are interpreted as a local time.

所以 new Date("2018-07-01") 被解析为 UTC,但是 new Date("2018-07-01T00") 被解析为本地时间。

在 ES2017 和即将到来的 ES2018 中,它一直保持一致; here's the link to the current editor's draft ,它不再有那个确切的文本,但仍然以相同的方式定义它(尽管恕我直言不太清楚)。

您可以在这里测试您当前的浏览器:

function test(val, expect) {
var result = +val === +expect ? "Good" : "ERROR";
console.log(val.toISOString(), expect.toISOString(), result);
}
test(new Date("2018-07-01"), new Date(Date.UTC(2018, 6, 1)));
test(new Date("2018-07-01T00:00:00"), new Date(2018, 6, 1));

截至 2021 年 9 月的状态:

  • 现代版本的 Firefox、Chrome 和 Safari 都做到了这一点,包括 iOS 浏览器(它们目前都使用 Apple 的 JavaScriptCore JavaScript 引擎,因为如果它们执行 JIT,Apple 将不允许它们使用自己的引擎)
  • IE11 正确(有趣地)

截至 2018 年 4 月的状态:

  • IE11 正确(有趣地)
  • Firefox 做对了
  • Chrome 65(桌面版、Android)正确
  • Chrome 64 (iOS v11.3) 获取日期/时间格式错误(解析为 UTC)
  • iOS Safari v11.3 获取日期/时间格式错误(解析为 UTC)

奇怪的是,我在 v6.4(Chrome 64 中的 v8)和 v6​​.5(Chrome 65 中的 v8)之间已修复的 v8 问题列表中找不到问题;我只能找到 this issue它仍然是开放的,但似乎已经修复。

关于javascript - Chrome 将不带 Z 的 ISO 时间解释为 UTC; C#问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14923932/

63 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com