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
我想知道为什么以及是否有更好的方法来处理这个,除了手动检查月份和日期的位数?
在 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)