为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

泛舟湖上清波郎朗 2022-06-09 16:56:23
console.log(Date.parse('COVINGTONOFFICE-2')) // 981003600000console.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()) // trueconsole.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 dateconsole.log(Date.parse('Mon Nov 26 2018 18:03:33 GMT-0500 (Eastern Standard Time)')) // trueconsole.log(moment.isDate('Mon Nov 26 2018 18:03:33 GMT-0500 (Eastern Standard Time)')) // false... damn
查看完整描述

1 回答

?
BIG阳

TA贡献1859条经验 获得超6个赞

只是为了巩固我的发现,因为它们在评论中,其他人可能难以阅读或找到:

  • Chromium 引擎似乎为Date.parse('COVINGTONOFFICE-2')和返回相同的结果Date.parse('2')。它们都返回从 21 世纪初开始计算的月份,即2给您 2001 年 2 月 1 日。这仅适用于12:任何超出该数字的数字均无效。

  • Date.parse('COVINGTONOFFICE-2')返回我测试过的其他浏览器的无效日期

Chromium 的 V8 引擎有一些内部启发式方法,可以确定如何解析看起来像日期的字符串:并尽最大努力尝试猜测它。对于其他浏览器,他们干脆放弃了。

这符合建议,Date.parse()应避免使用。通过扩展,它甚至不应该用于模棱两可或看起来不像日期的字符串。正如MDN 文档所指出的,浏览器有不同的内部启发式/实现来执行解析:

不同主机解析日期字符串的方式仍然存在许多差异,因此应该手动解析日期字符串(如果要适应许多不同的格式,库可以提供帮助)。

我已经编译了一个快速的 ASCII 表来显示我到目前为止的发现:

+---------------------------------+--------------------+---------+-----------------+---------+---------------------+

|             Browser             | Chrome/Brave/Opera | Firefox |     Safari      |  IE11   | Edge (non-Chromium) |

+---------------------------------+--------------------+---------+-----------------+---------+---------------------+

| Date.parse('COVINGTONOFFICE-2') | Thu Feb 01 2001    | Invalid | Invalid         | Invalid | Invalid             |

| Date.parse('2')                 | Thu Feb 01 2001    | Invalid | Tue Jan 01 0002 | Invalid | Invalid             |

| Date.parse(2)                   | Thu Jan 01 1970    | NaN     | Thu Jan 01 1970 | NaN     | NaN                 |

+---------------------------------+--------------------+---------+-----------------+---------+---------------------+

作为对您的附加问题的回答:我认为您使用本机日期解析器面临的问题与 Moment.jsmoment(...)解析器相同。两者都相当宽容,因此它们可能会'COVINGTONOFFICE-2'根据浏览器实现解释为有效字符串。


Moment.js 确实提供了手动指定日期字符串格式的可能性,但它不支持以语言环境格式(即,...)表示一天中的任何一周的Mon任何Tue标记Wed。您可以实现的最接近的是指定LLLL格式:它似乎适用于使用以下new Date().toString()方法打印出的日期:


// true

console.log(moment('Mon Nov 26 2018 18:03:33 GMT-0500 (Eastern Standard Time)', 'LLLL').isValid());


// false

console.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 有效的日期格式吗?


查看完整回答
反对 回复 2022-06-09
  • 1 回答
  • 0 关注
  • 101 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信