尽管使用++

时间:2015-05-21 11:28:23

标签: javascript while-loop counter nested-function

背景资料

我正在设置一个函数,该函数根据开始日期和结束日期创建日期数组。

该函数将接收开始日期和结束日期,这些日期首先被格式化为year-month-dayT12:00:00:00格式,然后以.getTime()格式转换为毫秒。

我的剧本

我制作了以下脚本来创建数组。

var $date_array = [];

function calc_workdays_between_dates (a, b) {

    function $create_date_array ($start_date, $end_date) {

        var $counter    = 0;

        while ($start_date !== $end_date) {

            var x = new Date($start_date);

            x.setDate(x.getDate() + $counter);
            $date_array.push(x);
            $start_date = x.getTime();
            $counter++; 
        }
    }

    $create_date_array (a, b);
}

请注意,$create_date_array功能嵌套在$calc_workdays_between_dates功能中是有原因的。现在我已经删除了$calc_workdays_between_dates函数的所有其他部分,只关注手头的问题(我也在这个剥离版本上运行我的测试 - 所以函数的其余部分不会影响任何东西)。

我的问题

示例1:

如果我使用calc_workdays_between_dates (x1, x2);调用函数,其中:

x1 = new Date("2015-04-04") //formatted and converted to ms before invoking function
x2 = new Date("2015-04-07")

导致$date_array获得以下内容:

Sat Apr 04 2015 12:00:00 GMT+0200 (CEST)
Sun Apr 05 2015 12:00:00 GMT+0200 (CEST)
Tue Apr 07 2015 12:00:00 GMT+0200 (CEST)

正如您所看到的那样,由于某种原因,该功能会在星期一(总共一天)跳过。

示例2:

x1 = new Date("2015-04-04") //formatted and converted to ms before invoking function
x2 = new Date("2015-04-10")

结果:

Sat Apr 04 2015 12:00:00 GMT+0200 (CEST)
Sun Apr 05 2015 12:00:00 GMT+0200 (CEST)
Tue Apr 07 2015 12:00:00 GMT+0200 (CEST)
Fri Apr 10 2015 12:00:00 GMT+0200 (CEST)

正如你所看到的,这个功能以某种方式跳过星期一,星期三和星期四(总共3天)。

示例3:

x1 = new Date("2015-04-04") //formatted and converted to ms before invoking function
x2 = new Date("2015-04-14")

结果:

Sat Apr 04 2015 12:00:00 GMT+0200 (CEST)
Sun Apr 05 2015 12:00:00 GMT+0200 (CEST)
Tue Apr 07 2015 12:00:00 GMT+0200 (CEST)
Fri Apr 10 2015 12:00:00 GMT+0200 (CEST)
Tue Apr 14 2015 12:00:00 GMT+0200 (CEST)

正如您所看到的,该实例中的功能会在周一,周三,周四,周六,周日和周一(共6天)内跳过。

示例4:

x1 = new Date("2015-04-04") //formatted and converted to ms before invoking function
x2 = new Date("2015-04-08")

导致功能无法正常工作。似乎while循环继续无休止地运行。

我的问题

什么使脚本跳过几天?

1 个答案:

答案 0 :(得分:7)

您根据$start_datecounter计算下一个日期。但是,在while循环中$start_date被重新分配,因此不再代表开始日期。因此,它不应该使用counter递增,而只能使用一个递增。

正确的解决方案是:

while ($start_date !== $end_date) {
    var x = new Date($start_date);
    x.setDate(x.getDate() + 1);
    $date_array.push(x);
    $start_date = x.getTime();
}