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
正如你所看到的,这里没有什么意外
有关验证日期的方式和原因的更多信息,请参阅以下答案:
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
正如你所看到的,这里没有什么意外
有关验证日期的方式和原因的更多信息,请参阅以下答案: