Javascript上有趣的怪癖

Javascript上有趣的怪癖,javascript,node.js,date,timezone,Javascript,Node.js,Date,Timezone,有人能用破折号分隔日期来解释以下行为吗 console.log(new Date('2015/03/03')); Tue Mar 03 2015 00:00:00 GMT+0000 (GMT Standard Time) console.log(new Date('2015-03-03')); Tue Mar 03 2015 00:00:00 GMT+0000 (GMT Standard Time) console.log(new Date('2015/04/03')); Fri Apr 0

有人能用破折号分隔日期来解释以下行为吗

console.log(new Date('2015/03/03'));
Tue Mar 03 2015 00:00:00 GMT+0000 (GMT Standard Time)

console.log(new Date('2015-03-03'));
Tue Mar 03 2015 00:00:00 GMT+0000 (GMT Standard Time)

console.log(new Date('2015/04/03'));
Fri Apr 03 2015 00:00:00 GMT+0100 (GMT Daylight Time)

console.log(new Date('2015-04-03'));
Fri Apr 03 2015 01:00:00 GMT+0100 (GMT Daylight Time) // This is the weird one
注:我在英国,所以冬季GMT+0,夏季GMT+1

注2:我已经读到我应该使用“/”作为分隔符,特别是IE11没有这样做,但我想知道在Chrome中怎么会出现这种情况

注3:在NodeJS中,它变得更加奇怪

console.log(new Date('2015/03/03'));
2015-03-03T00:00:00.000Z

console.log(new Date('2015-03-03'));
2015-03-03T00:00:00.000Z

console.log(new Date('2015/04/03'));
2015-04-02T23:00:00.000Z //This is the weird one this time

console.log(new Date('2015-04-03'));
2015-04-03T00:00:00.000Z

这看起来很奇怪,因为一些日期被解释为部分ISO日期(带破折号的日期),它们被解释为UTC,而另一些被神奇地解析并被解释为本地时区

这就是为什么我总是建议使用for date parsing,始终提供您明确期望的格式,并始终使用
true
作为
moment()
的第三个参数进行严格验证,以避免任何可能的误解,因为将错误数据放入数据库比崩溃更糟糕,在许多地方,日期可能是至关重要的

示例:

console.log( moment('2015/03/03', 'YYYY/MM/DD', true).toISOString() );
2015-03-02T23:00:00.000Z

console.log( moment('2015-03-03', 'YYYY-MM-DD', true).toISOString() );
2015-03-02T23:00:00.000Z

console.log( moment('2015/04/03', 'YYYY/MM/DD', true).toISOString() );
2015-04-02T22:00:00.000Z

console.log( moment('2015-04-03', 'YYYY-MM-DD', true).toISOString() );
2015-04-02T22:00:00.000Z
正如你所看到的,这里没有什么意外

有关验证日期的方式和原因的更多信息,请参阅以下答案:


这似乎很奇怪,因为一些日期被解释为部分ISO日期(带破折号的日期),它们被解释为UTC,而另一些被神奇地解析并被解释为本地时区

这就是为什么我总是建议使用for date parsing,始终提供您明确期望的格式,并始终使用
true
作为
moment()
的第三个参数进行严格验证,以避免任何可能的误解,因为将错误数据放入数据库比崩溃更糟糕,在许多地方,日期可能是至关重要的

示例:

console.log( moment('2015/03/03', 'YYYY/MM/DD', true).toISOString() );
2015-03-02T23:00:00.000Z

console.log( moment('2015-03-03', 'YYYY-MM-DD', true).toISOString() );
2015-03-02T23:00:00.000Z

console.log( moment('2015/04/03', 'YYYY/MM/DD', true).toISOString() );
2015-04-02T22:00:00.000Z

console.log( moment('2015-04-03', 'YYYY-MM-DD', true).toISOString() );
2015-04-02T22:00:00.000Z
正如你所看到的,这里没有什么意外

有关验证日期的方式和原因的更多信息,请参阅以下答案:


8601是一条真正的路径@云工厂。。。哪个ECMAScript没有完全遵循:(谢谢。重复链接与答案非常相关。8601是唯一正确的路径。@cloudworks…ECMAScript没有完全遵循该路径。:(谢谢。重复链接与答案非常相关。