日期('2015-1-1')输出与日期不同(2015-01-01)

Bri*_*ang 8 javascript date node.js

我刚发现,如果我使用new Date('2015-1-1'),时间没有时区效应,但如果我new Date('2015-01-01')在Node.js中使用时间有时区效果.

我输出4 Date():

    console.log(new Date('2015-1-1'));
    console.log(new Date('2015-01-1'));
    console.log(new Date('2015-1-01'));
    console.log(new Date('2015-01-01'));
Run Code Online (Sandbox Code Playgroud)

输出是

Thu Jan 01 2015 00:00:00 GMT+0800 (CST)
Thu Jan 01 2015 00:00:00 GMT+0800 (CST)
Thu Jan 01 2015 00:00:00 GMT+0800 (CST)
Thu Jan 01 2015 08:00:00 GMT+0800 (CST)
Run Code Online (Sandbox Code Playgroud)

你可以看到最后一次是08:00:00因为我在+8时区.

我认为输出取决于月份数或日期数.当它是10,11或12时,输出总是如此08:00:00

我想知道为什么以及是否有更好的方法来处理这个,除了手动检查月份和日期的位数?

Rob*_*obG 1

在 ECMA-262 ed 3 之前(包括 ECMA-262 ed 3),日期字符串的解析完全依赖于实现。在 ES5 中,没有时区的 ISO 8601 格式字符串将被解析为 UTC,但是解析任何其他类型的日期字符串仍然取决于实现。

使用 ECMAScript 2015,此类没有时区的字符串将被解析为本地字符串(即具有基于系统设置的偏移量)。

因此,您的 Node.js 实现似乎无法将前 3 个字符串识别为 ISO 8601,因此根据其他一些将它们视为 UTC 的内部逻辑来解析它们。

最后一个字符串被视为符合 ISO 8601,因此被解析为本地字符串。

如果您希望将所有此类字符串解析为本地字符串,您可以使用一个简单的函数,例如:

/*  @param {string} s - date string in format yyyy-[m]m-[d]d
**  @returns {Date} - a Date object for the specified date in a
**  timezone based on system settings.
**  Assumes that the string is a valid date.
*/
function parseISOLocal (s) {
  var b = s.split(/\D/);
  return new Date(b[0], b[1]-1, b[2]);
}

document.write(parseISOLocal('2015-1-1'))
Run Code Online (Sandbox Code Playgroud)