当我想检查字符串是否是Javascript中的日期时,我通常会执行以下操作:
!isNaN(Date.parse(myString));
但我刚发现
isNaN(Date.parse("smth")) === true
isNaN(Date.parse("smth_1")) === true
isNaN(Date.parse("1 smth")) === true
isNaN(Date.parse("smth 1")) === false // !!
请参阅this fiddle。
所以我的问题是:为什么以数字结尾的字符串(前面有空格)解析为有效日期(显然不是),以及如何可靠地检查它不是?
答案 0 :(得分:2)
已知的Chrome问题:
规范实际上说日期解析是依赖于实现的,并且在面对未知格式时,实现可能会做出最佳猜测。这就是V8的功能。我们可以更严格并拒绝更多字符串,但它的优先级非常低。
https://code.google.com/p/chromium/issues/detail?id=124398 https://code.google.com/p/chromium/issues/detail?id=126448
另外
答案 1 :(得分:1)
根据Mozilla开发者网络:
ECMAScript规范指出:如果String不符合标准格式,则该函数可以回退到任何特定于实现的启发式或特定于实现的解析算法。 ISO格式化字符串中包含非法元素值的无法识别的字符串或日期将导致Date.parse()返回NaN。
所以这是一个特定于实现的解析。