为什么Chrome V8 JavaScript引擎能够识别;TG-1“;透过「;TG-12“;有效日期/时间?

为什么Chrome V8 JavaScript引擎能够识别;TG-1“;透过「;TG-12“;有效日期/时间?,javascript,google-chrome,date,datetime,iso,Javascript,Google Chrome,Date,Datetime,Iso,我实现了一个CSV解析器,可以猜测每个列的类型格式,但是我发现JavaScript日期类认为“TG-1”是一个有效的日期/时间 这是Chrome支持的一种我以前从未见过的晦涩难懂的日期格式吗?我不认为这是一个有效的日期,从不同的日期ISO标准来看,我还没有看到这方面的参考 Chrome74说它是有效的 Firefox64说它是无效的 让validDate=true; 试一试{ d=新日期(“TG-1”); d、 toISOString() }捕获(e){ validDate=false } 控制

我实现了一个CSV解析器,可以猜测每个列的类型格式,但是我发现JavaScript日期类认为“TG-1”是一个有效的日期/时间

这是Chrome支持的一种我以前从未见过的晦涩难懂的日期格式吗?我不认为这是一个有效的日期,从不同的日期ISO标准来看,我还没有看到这方面的参考

Chrome74说它是有效的

Firefox64说它是无效的

让validDate=true;
试一试{
d=新日期(“TG-1”);
d、 toISOString()
}捕获(e){
validDate=false
}
控制台日志(有效期);
任何后跟
-
和数字1-12的字符串均视为有效:

d=新日期(“adsfadgag-12”)//每V8有效
引用以下内容:

遗产日期:

忽略第一个数字之前任何无法识别的单词。

括号内的文本将被忽略

后跟“:”的无符号数字是时间值,并添加到TimeComposer。后跟“::”的数字也会添加第二个零。后跟“.”的数字也是时间,后面必须跟毫秒

任何其他数字都是日期组件,并添加到DayComposer。月份名称(或实际上:任何单词的前三个字母与月份名称相同)在Day composer中记录为命名月份。可识别为时区的单词被记录为时区,如
(+|-)(hhmm | hh:)

传统日期不允许在读取数字后(在第一个数字之前,允许任何垃圾)使用额外的符号(“+”或“-”)或umatched')

两者的交叉点:匹配两种格式(例如1970-01-01)的字符串将被解析为ES5日期时间字符串-这意味着它将默认为UTC时区。如果遵循ES5规范,这是不可避免的

在扫描ES5日期时间字符串时读取有效的“T”后,输入不能再是有效的旧日期,因为“T”是读取数字后的垃圾字符串


换句话说:这种行为并不是真正计划好的,只是一些浏览器在某个时候表现得像这样,因此这种奇怪的行为必须保持<代码>日期(…)将尝试毫无怨言地解析几乎所有内容。

尝试使用无意义字符串创建日期时不会引发异常。您只得到了一个无法工作的日期对象。它看起来像是构造函数忽略了您的
TG
位,并将
1
视为
2001
Jan
。请看
console.log(d)
显示的内容。@Nicolas它可以是任何后跟-d=新日期(“adsfadgag-12”)的任意字符串valid@Keith
d=新日期(“adsfadgag-12”)
//也适用于每个V8