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”的有效日期而不是无效日期[重复]的主要内容,如果未能解决你的问题,请参考以下文章