奇怪的Javascript问题涉及拆分(“/”);

时间:2010-05-26 20:26:35

标签: 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(“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);
  ...
}

奇怪的是,代码再次起作用。现在不要误解我的意思,我欣喜若狂。我很担心为什么它起作用,但是,当另一个没有时。或多或少我只关心为什么对方不起作用。有没有人有一个很好的解释?

编辑:现在他们都破了。 >>

对于Tomas,这是完整的功能:

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 个答案:

答案 0 :(得分:0)

原始代码的问题很可能是您没有使用parseInt()调用的第二个参数,即指定要转换为的基数,默认情况下它假设为10个基数,但是当你的08情况下数字从零开始时,它会假定它是一个八进制数,所以解决方法是在你的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?