Chrome JavaScript引擎日期解析默认为2001年
在Chrome中,当字符串不包含年份时,为什么JavaScript默认为2001Chrome JavaScript引擎日期解析默认为2001年,javascript,date,Javascript,Date,在Chrome中,当字符串不包含年份时,为什么JavaScript默认为2001 t = new Date('Monday, Jan 11') Thu Jan 11 2001 00:00:00 GMT+0000 (Greenwich Mean Time) 编辑: fwiw,在React Native中也可以看到这种行为。这是由浏览器完成的,您可能正在使用Crome。对于其他浏览器,您也可以获得无效的日期。如果传递了一个字符串,则日期的构造函数将使用: 摘录: ECMAScript规范声明:如
t = new Date('Monday, Jan 11')
Thu Jan 11 2001 00:00:00 GMT+0000 (Greenwich Mean Time)
编辑:
fwiw,在React Native中也可以看到这种行为。这是由浏览器完成的,您可能正在使用Crome。对于其他浏览器,您也可以获得无效的日期。如果传递了一个字符串,则日期的构造函数将使用: 摘录: ECMAScript规范声明:如果字符串不符合标准格式,函数可能会退回到任何特定于实现的启发式或特定于实现的解析算法。ISO格式字符串中不可识别的字符串或包含非法元素值的日期将导致Date.parse()返回NaN 但是,根据浏览器和提供的值,未被ECMA-262定义为简化ISO格式的日期字符串中的无效值可能会或可能不会导致NaN,例如:
// Non-ISO string with invalid date values
new Date('23/25/2014');
将在Firefox 30中被视为2015年11月25日的本地日期,在Safari 7中被视为无效日期
因此,答案是两者的结合,因为您执行它的浏览器决定了这一点,而这不是一个标准,因此浏览器可能会返回几乎任何东西。我发现这是一个有趣的问题,所以我深入研究了V8引擎的源代码,这是Chrome使用的javascript引擎(出现这种现象的浏览器)对这种奇怪的行为进行反向工程 我在以下文件中找到此代码段: 假设没有年份的日期不符合ISO标准,则将
2000
或1900
添加到OPs未定义的年份
。这表明50
上方有一个断点,结果为真:
// Tested in Chrome:
console.log(new Date('1 1 49').getFullYear()); // 2049
console.log(new Date('1 1 50').getFullYear()); // 1950
文件year
中较高位置的定义如下:
int year = 0; // Default year is 0 (=> 2000) for KJS compatibility.
作为由采用的非常早期的javascript引擎,它又被分叉为Chromium,因此选择此默认值似乎是出于未知的与古代祖先引擎兼容的原因。不过,按照此逻辑,年份应默认为2000
,而不是2001
。结果可能是出于此目的n
在同一文档中,出现以下代码段:
// Day and month defaults to 1.
while (index_ < kSize) {
comp_[index_++] = 1;
}
//日期和月份默认为1。
while(索引大小){
comp_[index_++]=1;
}
comp
保存[日、月、年]
的默认值。根据注释判断,kSize
应该是3
,因此如果没有另外指定,只有day
和month
会设置为1
但是,kSize
是4
,因此循环也会在year
部分上迭代。year
则是(如果未指定)设置为1
,覆盖以前的int year=0
语句。前面提到的条件开始生效,year+=2000
发生时,您将以奇数默认值2001
结束
我怀疑这是一个bug,但无法确定解析不存在的日期的预期行为是否很难定义。无论如何,您应该最好指定自己的默认年份。并且,通过V8引擎的遥远源代码结束了这个小小的推测旅程。这似乎是特定于Chrome的。Firefox返回一个无效日期这是一种非标准日期格式。因此,结果完全取决于实现-允许引擎使用任何解析模式或启发式方法来确定日期。我建议使用标准日期格式,这是ISO 8601的精简版本,或者使用日期库来解析日期。shor答案是以ECMA-262支持的格式以外的格式解析时间戳取决于实现。您可能会获得预期日期、其他日期或无效日期,这些日期使用相同的字符串在不同的实现(甚至是相同实现的版本)中生成不同的结果。因此,强烈建议避免使用内置解析器。谢谢大家的回答!同意这是一个特定于浏览器的错误。@RobG您能重新打开这个问题吗?这与另一个问题不完全相同。我希望了解有关此特定问题的v8中的实现。谢谢!OP没有得到支持有效日期,他们得到一个意外的年份(2001年)。Safari返回一个2000年的日期,Chrome a 2001和Firefox返回一个无效的日期。
// Day and month defaults to 1.
while (index_ < kSize) {
comp_[index_++] = 1;
}