JavaScript setFullYear()方法返回错误的日期

时间:2012-03-07 10:38:00

标签: javascript

今天早上我注意到了JavaScript setFullYear方法的一个特殊问题。

使用这样的方法时:

d.setFullYear(2012,2,8);

返回正确的值:

Thu Mar 08 2012 10:30:04 GMT+0000 (GMT Standard Time)

但是,如果我使用parseInt方法返回整数,则返回的日期不正确:

d.setFullYear(parseInt("2012"), parseInt("02"), parseInt("08"));

返回:

Wed Feb 29 2012 10:31:30 GMT+0000 (GMT Standard Time)

看来parseInt方法返回的值不正确,但是当我测试它时:

document.write(parseInt("2"));

然后返回正确的值(2)

这里有一个工作小提琴:http://jsfiddle.net/rXByJ/

问题在于parseInt还是setFullYear?

4 个答案:

答案 0 :(得分:9)

问题是parseInt('08')0。这有效:

d.setFullYear(parseInt("2012"), parseInt("02"), 8);
  

parseInt('08')和parseInt('09')都返回零,因为   函数试图确定数值系统的正确基数   用过的。在Javascript中,以零开头的数字被视为八进制   八进制中没有08或09,因此问题就出现了。

http://www.ventanazul.com/webzine/articles/issues-parseint-javascript

解决方案是使用第二个参数:

parseInt('08', 10) 

Number('08')

另见How do I work around JavaScript's parseInt octal behavior?

答案 1 :(得分:2)

有关stackoverflow的这篇文章here详细解释了为什么应该将parseInt用于baseradix

答案 2 :(得分:1)

是的,真正的parseInt('08')将返回0而不是8,因为它将08作为八进制数转换为0所以你应该使用parseInt('08',10),其中第二个参数指定转换的基数,即十进制为10

所以总之在使用parseInt时总是指定base:)

答案 3 :(得分:0)

如果你没有覆盖Date.prototype.setFullYear()函数,那么它将返回一个日期对象而不是毫秒,你可以这样做。

Date.prototype.setFullYear = (function(ref){
   return function(val){ 
      return new Date(ref.bind(this)(val));
  }
})(Date.prototype.setFullYear)