2012-03-07 59 views
5

今天早上我注意到了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上嗎?

+1

很好的問題。真是個陷阱! – PiTheNumber 2012-03-07 10:48:29

回答

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

數字需要在08年左右的報價。被警告,數字('08 .789')將產生8.789的輸出。如果你真的想要一個整數,不要使用數字 – 2012-03-07 11:13:16

+0

輝煌!雖然parseInt(「8」)和parseInt(「08」)可能不同,但我不會每天都反對八進制基礎...... – 2012-03-07 11:57:35

1

是那真parseInt函數(08' )將返回0而不是8,因爲它需要08作爲八進制數並轉換爲0,因此您應該使用parseInt('08',10),其中第二個參數指定轉換的基數,即小數點爲10

總之,使用parseInt函數:)

2

計算器上的這個帖子here時,對爲什麼要使用parseInt函數有非常詳細的解釋baseradix

0

如果你都OK與壓倒一切的Date.prototype.setFullYear()功能,因此,它會返回一個日期對象而不是毫秒,你可以做到這一點。

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