尽管使用 ++,但循环计数器“呈指数”增加
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_date
和counter
计算下一个日期。但是,在 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 分钟感到头疼。我只是看不到它!非常感谢!以上是关于尽管使用 ++,但循环计数器“呈指数”增加的主要内容,如果未能解决你的问题,请参考以下文章