代码是:
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中的行为。我是否需要更改所有代码?
答案 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。这是合理的,也是许多其他实现正在做的事情。不要求它使用一组数据或另一组数据,所以不要依赖这些东西。