1 回答
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 有效的日期格式吗?
添加回答
举报