【问题标题】:chrome 67 date vs Chrome 66 date铬 67 日期与铬 66 日期
【发布时间】:2018-06-12 10:12:51
【问题描述】:

代码是:

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 中的行为。我需要更改所有代码吗?

【问题讨论】:

  • 这只是表示的轻微变化,您是否真的注意到任何问题
  • 是的..因为我将值发送到服务器端。在服务器端,我使用 php 的碳库来了解这个日期和时区。 Carbon 无法理解新格式
  • 为什么要发送.toString()?将其作为 ISO8601 格式的日期时间或 Unix 样式的时间戳发送。
  • 不同时区的人们正在使用该应用程序。如果我只是将时间戳发送回服务器,我将丢失该主题在哪个时区创建的信息。这种变化在 chrome 中非常重要。为什么我在 chrome 67 发行说明中看不到此更改?
  • 看起来,是的。您应该使用适当的标准化格式,而不是浏览器实现选择的任何表示;这取决于供应商,例如stackoverflow.com/a/39888177/3001761.

标签: google-chrome date timezone


【解决方案1】:

一般来说,您不应该为特定的浏览器编写代码,而应该按照标准编写代码。在这种情况下,标准是 ECMAScript (ECMA-262)。 Section 20.3.4.41 涵盖了Date.prototype.toString(),指的是下面描述内部ToDateString(tv) 函数的部分,其中解释了:

返回一个依赖于实现的字符串值,它使用一种方便的、人类可读的形式将 tv 表示为当前时区中的日期和时间。

“依赖于实现”是指实际的字符串值不是由规范定义的,并且可能因一种实现而异。您无法保证从一个浏览器到另一个浏览器,或者从一个版本的浏览器到另一个版本,甚至从一个操作系统到另一个版本的同一浏览器。

“人类可读的形式”是指产生的值适合显示给人类。它不保证以计算机代码可以一致解析的方式表示该值。

因此,如果您打算将字符串值发送到其他代码,则不应使用.toString()。通常,为此目的,您应该首选 ISO 8601 格式的字符串。如果您想要 UTC 格式的结果,请使用 .toISOString()。如果您想要本地时间(包括时区偏移)的结果,请参阅this answer(或使用库)。

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

【讨论】:

    猜你喜欢
    • 2012-07-10
    • 2019-08-27
    • 2016-01-19
    • 1970-01-01
    • 2014-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-05
    相关资源
    最近更新 更多