Chrome返回字符串“FY 2000”的有效日期而不是无效日期[重复]

Posted

技术标签:

【中文标题】Chrome返回字符串“FY 2000”的有效日期而不是无效日期[重复]【英文标题】:Chrome returns valid date for string "FY 2000" instead of invalid date [duplicate] 【发布时间】:2018-02-06 10:43:08 【问题描述】:

Chrome 返回字符串“FY 2000”的有效日期而不是无效日期,而其他浏览器正确返回“无效日期”

小提琴链接:https://jsfiddle.net/Lddr79ek/

代码:

function isDate(value)

    return new Date(value).toString()!= "Invalid Date");

这是 chrome 浏览器的问题吗?

编辑 问题是报告的行为仅在 chrome 浏览器中破坏了我们的产品。我检查了 SO 中的其他答案,但它们也不适用于 chrome。

【问题讨论】:

简短回答:不要通过将 Date 与字符串进行比较来检查无效日期。我在 Edge(我当前的浏览器)上检查了你的 sn-p,当调用 new Date() 时,我得到了一个 Date 对象。 @Tim Given 答案在 chrome 中不起作用 那么你应该给我们一个 reproducible 的代码示例,该示例可以由另一个 SO 用户在 Chrome 上轻松运行。您当前的方法在任何浏览器 AFAIK 上都不理想,因此它在 Chrome 上不起作用是一个有争议的问题。 Chrome 几乎可以接受任何东西,'In the year 2525' 也被解析为有效日期。 @Kira——这是重复的。自 ECMAScript 版以来。 5、内置解析器只需要解析标准中指定的格式(ISO 8601扩展的一个版本)。其他任何事情都完全依赖于实现,也就是说,实现可以根据需要解析字符串。在埃德之前。 5,根本不需要解析任何特定的格式。 【参考方案1】:

我不认为这是一个错误。当您使用字符串作为参数调用Date 构造函数时,该字符串将通过Date.parse 进行解析。

而MDN 说:

由于浏览器的差异和不一致,强烈建议不要使用 Date.parse 解析字符串。

还有says:

但是,日期字符串中的无效值不被识别为 ECMA-262 定义的简化 ISO 格式可能会也可能不会导致 NaN,具体取决于浏览器和提供的值,例如:

看起来当前的 V8 (Chrome) 解析实现试图猜测传递了什么。

仅供参考:

crbug 相关问题:#126448 V8 日期解析实现:dateparser-inl.h

【讨论】:

日期永远不会是 NaN @ManojPilania — Date.parse 的结果将是 NaN,其中字符串被确定为无效日期。如果在 Date 构造函数中使用了无效的日期字符串(其中“invalid”完全取决于解析器),则内部时间值将为 NaN 并且 Date.prototype.toString 将返回“Invalid date” . 看起来 crbug #126448 对于“FY2017”、“a1”等字符串已部分修复。如果字符串和数字部分之间有空格,则认为是有效日期 @RobG 你是对的。【参考方案2】:

Chrome 只解析输入字符串中的数字。

例子:

new Date('AS 2017') //Year part is parsed.
Sun Jan 01 2017 00:00:00 GMT+0300

new Date('XCNCNNC 2017') //Year part is parsed.
Sun Jan 01 2017 00:00:00 GMT+0300

new Date('FY2017') //without space. Year is not parsed.
Invalid Date

【讨论】:

以上是关于Chrome返回字符串“FY 2000”的有效日期而不是无效日期[重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何检查字符串是不是为有效日期

DateFormatter 返回有效字符串

测量图像的宽度和高度在 Chrome 和 Firefox 中返回 0,但在 Safari 中有效

VBScript 内置函数

比较两个单元格时返回有效日期

如果发现日期字符串位于日期之间,请返回pay_period_start和pay_period_end。怎么样?