Javascript从随机字符串返回意外日期

时间:2015-08-20 09:33:21

标签: javascript

我在javascript日期遇到了这个奇怪的案例。

我的系统产生了一些奇怪的日期,调试后我遇到了这个问题:

new Date('CWE Client-XXX Root 45')
Sun Jan 01 2045 00:00:00 GMT+0000 (GMT)

然后意识到Javascript正在获取最后一个号码并返回日期而不是"无效日期"。

为什么会这样?按照下面的一些测试。奇怪的是,它并不适用于所有数字。

new Date('1')
Mon Jan 01 2001 00:00:00 GMT+0000 (GMT)

new Date('2')
Thu Feb 01 2001 00:00:00 GMT+0000 (GMT)

new Date('3')
Thu Mar 01 2001 00:00:00 GMT+0000 (GMT)

new Date('4')
Sun Apr 01 2001 00:00:00 GMT+0100 (BST)

new Date('5')
Tue May 01 2001 00:00:00 GMT+0100 (BST)

new Date('6')
Fri Jun 01 2001 00:00:00 GMT+0100 (BST)

new Date('7')
Sun Jul 01 2001 00:00:00 GMT+0100 (BST)

new Date('8')
Wed Aug 01 2001 00:00:00 GMT+0100 (BST)

new Date('9')
Sat Sep 01 2001 00:00:00 GMT+0100 (BST)

new Date('10')
Mon Oct 01 2001 00:00:00 GMT+0100 (BST)

new Date('11')
Thu Nov 01 2001 00:00:00 GMT+0000 (GMT)

new Date('12')
Sat Dec 01 2001 00:00:00 GMT+0000 (GMT)

new Date('13')
Invalid Date

new Date('19')
Invalid Date

new Date('20')
Invalid Date

new Date('29')
Invalid Date

new Date('30')
Invalid Date

new Date('32')
Thu Jan 01 2032 00:00:00 GMT+0000 (GMT)

new Date('33')
Sat Jan 01 2033 00:00:00 GMT+0000 (GMT)

new Date('34')
Sun Jan 01 2034 00:00:00 GMT+0000 (GMT)

new Date('35')
Mon Jan 01 2035 00:00:00 GMT+0000 (GMT)

new Date('36')
Tue Jan 01 2036 00:00:00 GMT+0000 (GMT)

new Date('37')
Thu Jan 01 2037 00:00:00 GMT+0000 (GMT)

new Date('38')
Fri Jan 01 2038 00:00:00 GMT+0000 (GMT)

new Date('39')
Sat Jan 01 2039 00:00:00 GMT+0000 (GMT)

new Date('40')
Sun Jan 01 2040 00:00:00 GMT+0000 (GMT)

new Date('50')
Sun Jan 01 1950 00:00:00 GMT+0000 (GMT)

new Date('80')
Tue Jan 01 1980 00:00:00 GMT+0000 (GMT)

new Date('90')
Mon Jan 01 1990 00:00:00 GMT+0000 (GMT)

new Date('100')
Fri Jan 01 100 00:00:00 GMT+0000 (GMT)

2 个答案:

答案 0 :(得分:1)

Date对象的构造函数中的dateString使用Date.parse()将其转换为Date。以下是MDN对不在proper format中的字符串的引用:

  

ECMAScript规范指出:如果String不符合标准格式,则该函数可以回退到任何特定于实现的启发式或特定于实现的解析算法。

请注意,奇怪的是来自回退,这可能因浏览器而异。当Date.parse()返回NaN时,由于解析失败,Date对象将显示Invalid Date

  

但是,ES5定义的日期字符串中未识别为ISO格式的无效值可能会也可能不会导致NaN,具体取决于所提供的浏览器和值。

答案 1 :(得分:0)

这是因为myDel += new MyDelegate(MultNum);使用new Date () line 520。您可以在15.9.4.3节中看到Date.UTC的工作原理。

Date.parse(x.toUTCString())

在这种情况下,您只提供年份。

Date.UTC (year, month [, date [, hours [, minutes [, seconds [, ms ] ] ] ] ] )

添加第二个参数时,

new Date('45')
"Sun Jan 01 2045"

我猜JavaScript试图从你的字符串中解析日期,因为它只识别数字,所以它是第一个选项。