为什么一串数字的工作方式与新日期中的实际数字不同?

时间:2013-10-16 22:13:02

标签: javascript string date numbers

为什么一串数字与新Date()中的实际数字的工作方式不同:

var myfirstDate = new Date("2013, 10, 15"); //returns Tue Oct 15 2013 00:00:00 GMT-0500 (CDT)
var mysecondDate = new Date(2013, 9, 15); // also returns Tue Oct 15 2013 00:00:00 GMT-0500 (CDT)

myfirstDate.value == mysecondDate.value; //returns true

我查看了几个教程,并且甚至没有提到像myfirstDate这样的字符串的想法。 javascript会自动解析字符串吗?

2 个答案:

答案 0 :(得分:4)

请参阅the docs

您正在有效地调用两个不同的构造函数。

第一个被解析为人类可读的日期:

new Date(dateString)

第二个参数需要3个或更多参数,提供一年, 0 月份数和一天

new Date(year, month, day [, hour, minute, second, millisecond]);
  

<强>年

     
    

表示年份的整数值。为了兼容性(为了避免Y2K问题),您应该始终指定年份;使用1998,而不是98。

  
     

<强>月

     
    

表示月份的整数值,从1月的0开始到12月的11。

  
     

<强>天

     
    

表示月中某天(1-31)的整数值。

  

答案 1 :(得分:2)

直到ES5,日期字符串的解析完全依赖于实现,尽管有一个或两个字符串被多个浏览器一致地解析。 ES5引入了parsingversion of ISO8601,但所有使用的浏览器都不支持它。

最好手动解析日期字符串以确保它们是正确的。有各种各样的库可以帮助解决这个问题,但这并不困难(2行代码)。

顺便说一句,没有 Date.prototype.value 方法,因此您可能正在将 undefined 与自身进行比较。你应该比较时间值,所以:

myfirstDate.getTime() == mysecondDate.getTime();

或只是:

myfirstDate == mysecondDate;

哦,回答这个问题:当Date函数作为构造函数with a single string argument调用时,它被视为日期字符串并进行解析(参见上文)。所以“10”代表十月。

当Date作为具有more than one argument的构造函数调用时,它们被视为日期值,因此9被视为10月,因为月份参数为零索引(0 = 1月,1 = 2月等。 )。