JavaScript setFullYear()方法返回一个不正确的日期
今天早上我注意到了JavaScript setFullYear方法的一个特殊问题。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上吗?
问题是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?
数字需要在08年左右的报价。被警告,数字('08 .789')将产生8.789的输出。如果你真的想要一个整数,不要使用数字 – 2012-03-07 11:13:16
辉煌!虽然parseInt(“8”)和parseInt(“08”)可能不同,但我不会每天都反对八进制基础...... – 2012-03-07 11:57:35
是那真parseInt函数(08' )将返回0而不是8,因为它需要08作为八进制数并转换为0,因此您应该使用parseInt('08',10),其中第二个参数指定转换的基数,即小数点为10
总之,使用parseInt函数:)
如果你都OK与压倒一切的Date.prototype.setFullYear()
功能,因此,它会返回一个日期对象而不是毫秒,你可以做到这一点。
Date.prototype.setFullYear = (function(ref){
return function(val){
return new Date(ref.bind(this)(val));
}
})(Date.prototype.setFullYear)
很好的问题。真是个陷阱! – PiTheNumber 2012-03-07 10:48:29