今天早上我注意到了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?
答案 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用于base
或radix
答案 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)