2010-05-26 2 views
1

Итак, используя следующие функции:Странная проблема с Javascript Вовлечение split ("/");

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 ("12/08/1990", 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; 
} 

Что касается входных данных для функции, я назвал эту функцию из консоли с помощью date_add('12/08/1990',1);

+1

В каком браузере был это? Это звучит очень странно ... И FF, и Chrome дают мне тот же результат. И, конечно же, они ** уложили **. –

+0

Не знаю, что вам сказать - я скопировал первый фрагмент кода в консоль firebug и получил тот же вывод в обоих журнальных сообщениях: '[" 12 "," 08 "," 1990 "]' –

+3

Почему бы не использовать встроенный объект 'Date'? Или «у каждого года февраль имеет ровно 28 дней» - обязательная функция? – kennytm

ответ

0

Проблемы с исходным кодом скорее всего, вы не использовали второй параметр для своих звонков parseInt(), который должен указать базу, для которой вы хотите конвертировать, по умолчанию он предполагает базу 10, но когда число начинается с нуля, как в вашем случае 08, то он принимает свое восьмеричное число, поэтому решение состоит в том, чтобы использовать второй pa госу в ваших 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?

Смежные вопросы