尽管使用 ++,但循环计数器“呈指数”增加

Posted

技术标签:

【中文标题】尽管使用 ++,但循环计数器“呈指数”增加【英文标题】:While loop counter increasing "exponentially" in spite of using ++ 【发布时间】:2015-08-03 01:02:04 【问题描述】:

背景资料

我正在设置一个基于开始日期和结束日期创建日期数组的函数。

该函数将接收开始和结束日期,它们首先被格式化为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循环继续无休止地运行。

我的问题

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

【问题讨论】:

嗯,您的 $create_date_array 函数需要一个 Date 对象,但您传递的是一个数组 (x1 = [new Date("2015-04-04")])。我错过了什么吗? @NikolaDimitroff:$create_date_array 函数以毫秒为单位接收日期,然后在执行任何计算之前将其转换为函数本身的日期。日期出现在括号中是另一个错误。我已经删除了它们。 【参考方案1】:

您根据$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();

【讨论】:

天哪 - 谢谢@mvdssel。到现在为止,我盯着剧本大约 90 分钟感到头疼。我只是看不到它!非常感谢!

以上是关于尽管使用 ++,但循环计数器“呈指数”增加的主要内容,如果未能解决你的问题,请参考以下文章

C ++线程:尽管没有种族,但共享内存未更新

如何在 C# 中使用 SqlDataReader 获取行数

在 foreach 循环中切换语句 - 没有得到预期的结果

Amazon SQS“接收计数”只会增加

未来的 For 循环中的 Int 不会增加 Flutter/Firestore

如何在嵌套数组中使用 apex_json.get_count