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进行日期解析,并始终提供您明确期望的格式,并始终使用
例子:
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 |
如你所见,这里没有惊喜。
有关如何以及为何验证日期的更多信息,请参阅以下答案:
- 检查字符串是否为日期值