2010-05-26 61 views
1

好了,使用下面的函數:涉及split的奇怪Javascript問題(「/」);

function date_add(date, days) 
{ 
    var dim = {1:31, 2:28, 3:31, 4:30, 5:31, 6:30, 7:31, 8:31, 9:30, 10:31, 11:30, 12:31}; 
    console.log(date.split("/")); 
    var date_arr = date.split("/"); 
    console.log(date_arr); 
    ... 
} 

我會在控制檯屏幕下面的輸出DATE_ADD( 「1990年12月8日」,1)

["12", "08", "1990"] 
["2", "08", "1990"] 

花費一個小時的掙扎什麼能解決這個奇怪的問題,一時興起,我改變了功能於以下內容:

function date_add(date, days) 
{ 
    var dim = {1:31, 2:28, 3:31, 4:30, 5:31, 6:30, 7:31, 8:31, 9:30, 10:31, 11:30, 12:31}; 
    date = date.split("/"); 
    console.log(date); 
    ... 
} 

奇妙的是,該代碼再次工作。現在不要誤解我的意思,我欣喜若狂。不過,我對嚴重擔心,爲什麼它的工作,但是,當其他人沒有。或多或少,我只關心爲什麼對方沒有工作。有沒有人有一個很好的解釋?

編輯:現在他們都壞了。 >>

對於托馬斯,這裏是全功能:

function date_add(date, days) 
{ 
    var dim = {1:31, 2:28, 3:31, 4:30, 5:31, 6:30, 7:31, 8:31, 9:30, 10:31, 11:30, 12:31}; 
    console.log(date); 
    console.log(date.split("/")); 
    date_arr = date.split("/"); 
    console.log(date) 
    if (date_arr[0][0] = "0") date_arr[0] = date_arr[0][1]; 
    if (date_arr[1][0] = "0") date_arr[1] = date_arr[1][1]; 
    var month = parseInt(date_arr[0]); 
    var day = parseInt(date_arr[1]); 
    var year = parseInt(date_arr[2]); 
    console.log(month); 
    console.log(day); 
    console.log(year); 

    if ((year%4 == 0 && year%100 != 0) || year%400 == 0) 
    dim[2] = 29; 

    day += days; 
    while (day < 1) 
    { 
    month--; 
    if (month < 1) 
    { 
     month = 12; 
     year--; 
    } 
    day += dim[month]; 
    } 

    while (dim[month] < day) 
    { 
    day -= (dim[month]+1); 
    month++; 
    if (month > 12) 
    { 
     month = 0; 
     year++; 
    } 
    } 

    return ""+month+"/"+day+"/"+year; 
} 

對於輸入的功能,我叫使用​​

+1

在什麼瀏覽器是這個?這聽起來很奇特...... FF和Chrome都給了我相同的結果。當然,他們**可以**。 – 2010-05-26 20:28:48

+0

不知道該告訴你什麼 - 我將第一個代碼片段複製粘貼到firebug控制檯中,並在兩個日誌消息中獲得完全相同的輸出:'[「12」,「08」,「1990」]' – 2010-05-26 20:31:40

+3

爲什麼不使用內置'Date'對象?或者是「每年的2月正好28天」是一項必需的功能? – kennytm 2010-05-26 20:34:21

回答

0

與原有代碼的問題從控制檯此功能很可能您沒有使用parseInt()調用的第二個參數,即指定要轉換爲的基數,默認情況下其假定爲10個鹼基,但如果08情況下的數字以零開頭,那麼它假設它是一個八進制數,所以解決方案是使用第二個pa rameter在parseInt函數調用,就像這樣:

var month = parseInt(date_arr[0], 10); 
var day = parseInt(date_arr[1], 10); 
var year = parseInt(date_arr[2], 10); 

此問題已得到修復在JavaScript中的最後一個版本(EcmaScript的5),看到這個問題的更多信息:

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