2010-05-26 151 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?