chrome 67 date vs Chrome 66 date

时间:2018-06-12 10:12:51

标签: google-chrome date timezone

代码是:

var rightNow = new Date();
console.log(rightNow);

在Chrome 66中,它会返回:

Tue Jun 12 2018 15:36:19 GMT+0530 (IST)

在Chrome 67中,它会返回:

Tue Jun 12 2018 15:36:43 GMT+0530 (India Standard Time)

为什么会有差异?

我的很多代码都适用于chrome 66中的行为。我是否需要更改所有代码?

1 个答案:

答案 0 :(得分:1)

通常,您不应为特定浏览器编码,而应编写标准代码。在这种情况下,标准是ECMAScript(ECMA-262)。 Section 20.3.4.41涵盖Date.prototype.toString(),其中引用了以下描述内部ToDateString(tv)函数的部分,其中解释了:

  

返回一个依赖于实现的String值,该值使用方便的,可读的形式将tv表示为当前时区中的日期和时间。

“依赖于实现”,这意味着实际的字符串值不是由规范定义的,并且可以在不同的实现之间变化。从一个浏览器到下一个浏览器,或者从一个浏览器版本到下一个浏览器,或者从同一浏览器的同一版本从一个操作系统到下一个操作系统,不能保证相同的结果。

通过“人类可读的形式”,意味着产生的价值适合于向人类展示。它不能保证以一种可以由计算机代码一致地解析的方式表示该值。

因此,如果您打算将字符串值发送到其他代码,则不应使用.toString()。通常,为此,您应该更喜欢ISO 8601格式的字符串。如果您希望以UTC表示结果,请使用.toISOString()。如果您希望结果以当地时间(包括时区偏移量)表示,请参阅this answer(或使用库)。

至于Chrome 66和Chrome 67之间的变化原因 - 我没有确切的详细信息,但我认为Chrome已从使用IANA TZDB缩写切换为使用CLDR时区名称,可能是通过它使用ICU。这是合理的,也是许多其他实现正在做的事情。不要求它使用一组数据或另一组数据,所以不要依赖这些东西。