我刚刚发现,如果我使用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
我想知道为什么以及是否有更好的方法来处理这个问题,除非手动检查月份和日期的位数?
答案 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"