为什么 Date.parse('COVINGTONOFFICE-2') 返回真实日期?

console.log(Date.parse('COVINGTONOFFICE-2')) // 981003600000

console.log(new Date('COVINGTONOFFICE-2').toDateString()) // Thu Feb 01 2001

为什么这会返回有效日期?我错过了什么?


如果我想解析一个字符串,例如“2018 年 11 月 26 日星期一 18:03:33 GMT-0500(东部标准时间)”,并将其正确解析为日期,但上面的“COVINGTONOFFICE-2”失败日期测试,如果不将我自己的正则表达式组合在一起,我将如何以正确的方式进行?


这是我尝试过的:


console.log(moment('COVINGTONOFFICE-2').isValid()) // true

console.log(moment.isDate('COVINGTONOFFICE-2')) // false... good!

// so now I want to make sure that a date that has been stringified is still able to be parsed as valid date

console.log(Date.parse('Mon Nov 26 2018 18:03:33 GMT-0500 (Eastern Standard Time)')) // true

console.log(moment.isDate('Mon Nov 26 2018 18:03:33 GMT-0500 (Eastern Standard Time)')) // false... damn



泛舟湖上清波郎朗
浏览 102回答 1
1回答

BIG阳

只是为了巩固我的发现,因为它们在评论中,其他人可能难以阅读或找到:Chromium 引擎似乎为Date.parse('COVINGTONOFFICE-2')和返回相同的结果Date.parse('2')。它们都返回从 21 世纪初开始计算的月份,即2给您 2001 年 2 月 1 日。这仅适用于12:任何超出该数字的数字均无效。Date.parse('COVINGTONOFFICE-2')返回我测试过的其他浏览器的无效日期Chromium 的 V8 引擎有一些内部启发式方法,可以确定如何解析看起来像日期的字符串:并尽最大努力尝试猜测它。对于其他浏览器,他们干脆放弃了。这符合建议,Date.parse()应避免使用。通过扩展,它甚至不应该用于模棱两可或看起来不像日期的字符串。正如MDN 文档所指出的,浏览器有不同的内部启发式/实现来执行解析:不同主机解析日期字符串的方式仍然存在许多差异,因此应该手动解析日期字符串(如果要适应许多不同的格式,库可以提供帮助)。我已经编译了一个快速的 ASCII 表来显示我到目前为止的发现:+---------------------------------+--------------------+---------+-----------------+---------+---------------------+|&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Browser&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;| Chrome/Brave/Opera | Firefox |&nbsp; &nbsp; &nbsp;Safari&nbsp; &nbsp; &nbsp; |&nbsp; IE11&nbsp; &nbsp;| Edge (non-Chromium) |+---------------------------------+--------------------+---------+-----------------+---------+---------------------+| Date.parse('COVINGTONOFFICE-2') | Thu Feb 01 2001&nbsp; &nbsp; | Invalid | Invalid&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;| Invalid | Invalid&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;|| Date.parse('2')&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;| Thu Feb 01 2001&nbsp; &nbsp; | Invalid | Tue Jan 01 0002 | Invalid | Invalid&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;|| Date.parse(2)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;| Thu Jan 01 1970&nbsp; &nbsp; | NaN&nbsp; &nbsp; &nbsp;| Thu Jan 01 1970 | NaN&nbsp; &nbsp; &nbsp;| NaN&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;|+---------------------------------+--------------------+---------+-----------------+---------+---------------------+作为对您的附加问题的回答:我认为您使用本机日期解析器面临的问题与 Moment.jsmoment(...)解析器相同。两者都相当宽容,因此它们可能会'COVINGTONOFFICE-2'根据浏览器实现解释为有效字符串。Moment.js 确实提供了手动指定日期字符串格式的可能性,但它不支持以语言环境格式(即,...)表示一天中的任何一周的Mon任何Tue标记Wed。您可以实现的最接近的是指定LLLL格式:它似乎适用于使用以下new Date().toString()方法打印出的日期:// trueconsole.log(moment('Mon Nov 26 2018 18:03:33 GMT-0500 (Eastern Standard Time)', 'LLLL').isValid());// falseconsole.log(moment('COVINGTONOFFICE-2', 'LLLL').isValid());<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.24.0/moment.min.js"></script>这对我来说越来越像一个 XY 问题:你必须将字符串解析为日期吗?没有其他方法可以检索 ISO 有效的日期格式吗?
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript