关于node.js:Javascript上有趣的怪癖

Interesting quirk on Javascript

本问题已经有最佳答案,请猛点这里访问。

任何人都能用破折号日期解释以下行为吗?

1
2
3
4
5
6
7
8
9
10
11
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中它甚至更奇怪。

1
2
3
4
5
6
7
8
9
10
11
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,其他日期被神奇地解析并被解释为本地时区。

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

例子:

1
2
3
4
5
6
7
8
9
10
11
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

如你所见,这里没有惊喜。

有关如何以及为何验证日期的更多信息,请参阅以下答案:

  • 检查字符串是否为日期值