Javascript 当循环计数器增加时“;指数地;尽管使用了++;

Javascript 当循环计数器增加时“;指数地;尽管使用了++;,javascript,while-loop,counter,nested-function,Javascript,While Loop,Counter,Nested Function,背景信息 我正在设置一个函数,该函数根据开始日期和结束日期创建一个日期数组 函数将接收开始和结束日期,这些日期首先被格式化为年-月-日12:00:00:00格式,然后用.getTime()格式转换为毫秒 我的脚本 我制作了以下脚本来创建数组 var $date_array = []; function calc_workdays_between_dates (a, b) { function $create_date_array ($start_date, $end_date) {

背景信息

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

函数将接收开始和结束日期,这些日期首先被格式化为
年-月-日12: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\u date\u array
函数嵌套在日期之间的
$calc\u workdays\u函数中是有原因的。目前,我已经剥离了
$calc\u workdays\u interval\u dates
函数的所有其他部分,以便只关注手头的问题(我还在这个精简版本上运行测试-因此函数的其余部分不会影响任何东西)

我的问题

例1:

如果我在两个日期(x1,x2)之间调用函数
calc\u workdays\u其中:

x1 = new Date("2015-04-04") //formatted and converted to ms before invoking function
x2 = new Date("2015-04-07")
它会导致
$date\u数组
获得以下内容:

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:

结果:

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)
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)
正如您所看到的,函数以某种方式跳过了周一、周三和周四(总共3天)

例3:

结果:

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)
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:

导致函数不工作。while循环似乎继续无休止地运行

我的问题


是什么让脚本跳过了几天?

您根据
$start\u date
计数器计算下一个日期。但是,在while循环中,
$start\u date
被重新分配,因此不再表示开始日期。因此,不应使用
计数器
递增,而应仅使用一个计数器递增

正确的解决办法是:

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

嗯,您的
$create_date_array
func需要一个
date
对象,但您正在传递一个数组(
x1=[新日期(“2015-04-04”)]
)。我遗漏了什么吗?@NikolaDimitroff:
$create\u date\u array
函数接收以毫秒为单位的日期,然后在执行任何计算之前将其转换为函数本身的日期。另一个错误是日期出现在括号中。我已经删除了。哦,我的上帝-谢谢@mvdssel。到现在为止,我盯着剧本看了大约90分钟,头都疼了。我就是看不见!非常感谢你!
while ($start_date !== $end_date) {
    var x = new Date($start_date);
    x.setDate(x.getDate() + 1);
    $date_array.push(x);
    $start_date = x.getTime();
}