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

JavaScript setFullYear() Method Returning an incorrect date

本文关键字:错误 日期 返回 方法 setFullYear JavaScript      更新时间:2023-09-26

今天早上,我注意到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')

另请参阅如何处理JavaScript';s parseInt八进制行为?

stackoverflow上的这篇文章非常详细地解释了为什么应该将parseInt与baseradix 一起使用

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

所以简而言之,使用parseInt时总是指定base:)

如果您可以重写Date.prototype.setFullYear()函数,使其返回日期对象而不是毫秒,则可以执行此操作。

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