Chrome returns valid date for string “FY 2000” instead of invalid date
chrome返回字符串"fy 2000"的有效日期而不是无效日期,而其他浏览器则正确返回"无效日期"
小提琴链接:https://jsfiddle.net/lddr79ek/
代码:
1 2 3 4
| function isDate(value)
{
return new Date(value).toString()!="Invalid Date");
} |
这是Chrome浏览器的问题吗?
编辑问题是报告的行为仅在Chrome浏览器中破坏了我们的产品。我查了其他答案,但他们也不在Chrome中工作。
- 简短回答:不要通过比较Date和字符串来检查无效日期。我在edge上检查了你的代码片段(我现在的浏览器),当一个叫new Date()的对象被调用时,我得到了一个Date对象。
- @Tim给出的答案不适用于Chrome
- 然后,您应该给我们一个代码的可复制示例,它可以被另一个so用户轻松地在chrome上运行。您当前的方法在任何浏览器上都不理想,因此它不适用于Chrome是一个无意义的点。
- @为什么没有人正确理解这个问题?尝试在不同的浏览器中进行修改。您会发现除Chrome以外的所有浏览器都会返回"无效日期"
- @克莱斯,我的观点是"这些答案中没有一个在Chrome中有效"
- 我在发帖前试过了。不是所有41个,只有那些使用本地javascript的
- Chrome几乎可以接受任何东西,'In the year 2525'也被解析为有效日期。
- @这是复制品。由于ecmascript ed.5,内置的解析器只需要解析标准中指定的格式(扩展的iso8601版本)。任何其他内容都完全依赖于实现,也就是说,实现可以根据需要解析字符串。在第5版之前,根本不需要解析任何特定的格式。
- @Robg我不明白ECMA标准如何使我的问题重复。你的评论像是对我问题的解释
- @Robg,我也在使用日期构造函数而不是日期解析方法。你提到的标准不适用于这个问题。
- 到目前为止,ecma-international.org/ecma-262/5.1/ecma-262.pdf同意副本-"15.9.3.2…新的数据(…)将v解析为日期,方法与parse方法"和"15.9.4.2 date.parse(string)完全相同。函数首先尝试根据日期时间字符串格式(15.9.1.15)中调用的规则解析字符串的格式。如果字符串不符合…可能会退回到任何特定的实现…日期格式。
- @kira,如果您认为new Date和Date.parse所接受的格式应该包含在规范的不同部分中,那么在您的文章编辑中提供规范的解释可能会更容易,以便重新打开。
- @Kira浏览器只有一个解析器。为什么特定实现的日期构造函数和Date.Parse使用具有不同解析规则的不同分析器?整个实现应该符合标准,对于date.parse没有例外。
- @Alexeilevenkov,几个月前我开始使用标记问题的答案来实现,我认为它在Chrome中工作。但现在它不起作用了,所以我认为这可能是铬合金的一个漏洞。我可以编写自己的解析来解决这个问题,我想在进入生产阶段之前知道这是否是我身边的一个bug。
- @Kira的现实是,如果你需要从官方的未定义行为中定义行为,你必须编写自己的代码来实现。编写能够合理处理日期的日期时间分析器(尤其是需要支持多个国家的情况下)是很困难的(1/2/3代表什么天?).如果可以选择,强制输入某种特定格式(最好是ISO8601)是更好的选择。
Chrome只分析输入字符串中的数字。
例子:
1 2 3 4 5 6 7 8
| 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 |
我觉得这不是虫子。当使用字符串作为参数调用Date构造函数时,该字符串通过Date.parse解析。
而MDN说:
Parsing of strings with Date.parse is strongly discouraged due to browser differences and inconsistencies.
它还说:
However, invalid values in date strings not recognized as simplified ISO format as defined by ECMA-262 may or may not result in NaN, depending on the browser and values provided, e.g.:
看起来当前的V8(chrome)解析实现试图猜测传递了什么。
FY:
- CRbug相关问题:126448
- V8 date.parse实现:dateparser inl.h
- 日期永远不会成为Nan
- @manojpilania date.parse的结果将是NaN,其中字符串被确定为无效日期。如果日期构造函数使用了无效的日期字符串(其中"invalid"完全由分析器决定),则内部时间值将为NaN,并且date.prototype.toString将返回"invalid date"。
- 看起来CRbug 126448对于"FY217"、"A1"等字符串是部分固定的。如果字符串和数字部分之间有空格,则将其视为有效日期。
- @你说得对。