【问题标题】:Interesting quirk on Javascript [duplicate]Javascript的有趣怪癖[重复]
【发布时间】:2017-03-07 16:17:28
【问题描述】:

谁能用破折号分隔日期来解释以下行为?

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

【问题讨论】:

  • 8601 是一条真正的道路。 relevant xkcd
  • @cloudworks ... ECMAScript 没有完全遵循。 :(
  • 谢谢。重复的链接确实与答案相关。

标签: javascript node.js date timezone


【解决方案1】:

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

这就是为什么我总是建议使用Moment 进行日期解析,始终提供您明确期望的格式,并始终使用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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-19
    • 2010-09-18
    • 1970-01-01
    相关资源
    最近更新 更多