Javascript/Node 日期说明
Javascript/Node Date specification
我知道的 JS 官方文档是 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference
但我很好奇这是否也是谈论 NodeJS 时寻找的正确位置。
这里:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date 是关于 Date
的文档
Constructor:
new Date(year, monthIndex [, day [, hours [, minutes [, seconds [, milliseconds]]]]]);
还有
year
Integer value representing the year. Values from 0 to 99 map to the years 1900 to 1999; all other values are the actual year. See the example below.
monthIndex
Integer value representing the month, beginning with 0 for January to 11 for December.
如果我在 Chrome 中执行以下代码,我会得到与在节点 JS CLI 中不同的结果:
let d = new Date(2017,0,1);
console.log(d);
Chrome 结果是我对文档的期望:
Sun Jan 01 2017 00:00:00 GMT+0100 (Mitteleuropäische Normalzeit)
根据从 0 到 11 的 monthIndex,NodeJS 结果与预期不同
2016-12-31T23:00:00.000Z
另外格式好像不一样。那么 NodeJS 的官方文档在哪里,因为 MDN 文档似乎不适用于 NodeJS
编辑:
ECMA 文档(官方版本a 也说明范围是 0 - 11 而不是 1-12)
Months are identified by an integer in the range 0 to 11, inclusive.
编辑 2:
由于时区的原因,节点和 Chrome(任何浏览器)的实现似乎有所不同。所以时区 GMT +1 的浏览器比节点早一小时(至少从 dd.MM.yyyy 表示)
但为什么节点不返回 1.1.2017 00:00 和浏览器 1.1.2017 01:00 GTM +0100
?
--------------------【解决方法】-------------------- -----
当您使用 new Date([Whatever])
时,它总是在您的时区创建日期。
但取决于它在 GMT +0000 或您自己的时区中显示的实现。
因此,如果您想创建一个日期并且您不关心时区(这在 NodeJS 上通常是这种情况),您应该使用 Date.UTC 在 GTM +0000
中创建日期
NodeJS 是一个 ECMAScript 引擎,因此它确实遵循规范。两个对象构造函数的工作方式完全相同。
在中欧这里的午夜,当我们已经庆祝除夕时,居住在绿色时区的人们仍然需要等待一个小时。所以这两个日期实际上代表相同的时间点,只是当地时间不同。
但为什么 NodeJS 以祖鲁时间显示日期,而浏览器以本地时区显示日期?
那是因为您将日期对象传递给了 控制台 ,而控制台 未指定 。尽管 Chrome 向您显示本地时区的日期是有道理的,因为浏览器旨在向用户显示数据,而用户只对他的本地时间感兴趣,因为 NodeJS 是为服务器构建的,并且他们 运行 独立于他们的位置(你的服务器是 运行 在法兰克福、纽约还是东京重要吗?不,不重要)。
我知道的 JS 官方文档是 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference
但我很好奇这是否也是谈论 NodeJS 时寻找的正确位置。
这里:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date 是关于 Date
Constructor:
new Date(year, monthIndex [, day [, hours [, minutes [, seconds [, milliseconds]]]]]);
还有
year
Integer value representing the year. Values from 0 to 99 map to the years 1900 to 1999; all other values are the actual year. See the example below.
monthIndex
Integer value representing the month, beginning with 0 for January to 11 for December.
如果我在 Chrome 中执行以下代码,我会得到与在节点 JS CLI 中不同的结果:
let d = new Date(2017,0,1);
console.log(d);
Chrome 结果是我对文档的期望:
Sun Jan 01 2017 00:00:00 GMT+0100 (Mitteleuropäische Normalzeit)
根据从 0 到 11 的 monthIndex,NodeJS 结果与预期不同
2016-12-31T23:00:00.000Z
另外格式好像不一样。那么 NodeJS 的官方文档在哪里,因为 MDN 文档似乎不适用于 NodeJS
编辑: ECMA 文档(官方版本a 也说明范围是 0 - 11 而不是 1-12)
Months are identified by an integer in the range 0 to 11, inclusive.
编辑 2: 由于时区的原因,节点和 Chrome(任何浏览器)的实现似乎有所不同。所以时区 GMT +1 的浏览器比节点早一小时(至少从 dd.MM.yyyy 表示)
但为什么节点不返回 1.1.2017 00:00 和浏览器 1.1.2017 01:00 GTM +0100 ?
--------------------【解决方法】-------------------- -----
当您使用 new Date([Whatever])
时,它总是在您的时区创建日期。
但取决于它在 GMT +0000 或您自己的时区中显示的实现。
因此,如果您想创建一个日期并且您不关心时区(这在 NodeJS 上通常是这种情况),您应该使用 Date.UTC 在 GTM +0000
NodeJS 是一个 ECMAScript 引擎,因此它确实遵循规范。两个对象构造函数的工作方式完全相同。
在中欧这里的午夜,当我们已经庆祝除夕时,居住在绿色时区的人们仍然需要等待一个小时。所以这两个日期实际上代表相同的时间点,只是当地时间不同。
但为什么 NodeJS 以祖鲁时间显示日期,而浏览器以本地时区显示日期?
那是因为您将日期对象传递给了 控制台 ,而控制台 未指定 。尽管 Chrome 向您显示本地时区的日期是有道理的,因为浏览器旨在向用户显示数据,而用户只对他的本地时间感兴趣,因为 NodeJS 是为服务器构建的,并且他们 运行 独立于他们的位置(你的服务器是 运行 在法兰克福、纽约还是东京重要吗?不,不重要)。