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

时间:2015-11-29 11:14:48

标签: javascript node.js date

我刚刚发现,如果我使用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'));

输出

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)

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

我认为输出取决于月份数字或日期数字。如果是10,11或12,则输出始终为08:00:00

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

2 个答案:

答案 0 :(得分:1)

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

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

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

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

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



gem uninstall mocha
bundle install




答案 1 :(得分:0)

可能是一个错误,你可以做的最好的事情是使用像Moment这样似乎没有这个的库:

moment('2015-1-1').toString()
moment('2015-1-01').toString()
moment('2015-01-1').toString()
moment('2015-01-01').toString()

打印:

"Thu Jan 01 2015 00:00:00 GMT+0100"
"Thu Jan 01 2015 00:00:00 GMT+0100"
"Thu Jan 01 2015 00:00:00 GMT+0100"
"Thu Jan 01 2015 00:00:00 GMT+0100"