背景资料
我正在设置一个函数,该函数根据开始日期和结束日期创建日期数组。
该函数将接收开始日期和结束日期,这些日期首先被格式化为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循环继续无休止地运行。
我的问题
什么使脚本跳过几天?
答案 0 :(得分:7)
您根据$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();
}