问题描述
给定start
和end
日期,我试图创建一个数组,其中包含开始和结束日期之间所有星期的start
和end
日期。
当start
日期和end
日期之间的星期数为4或更短时,下面讨论的代码将起作用。
如果更多,它只是挂起。
有人可以向我解释发生了什么,或者至少指出我正确的方向。 谢谢。
function getWeeklyTimePeriod(start_d, end_d) {
var weekly = [];
var end_dstr = $.datepicker.formatDate('yy-mm-dd', end_d);
var sd = new Date(start_d);
while (true) {
var ed = new Date(sd);
ed.setDate(sd.getDate() + (6-(sd.getDay())));
sd_str = $.datepicker.formatDate('yy-mm-dd', sd);
ed_str = $.datepicker.formatDate('yy-mm-dd', ed);
if (ed < end_d) {
weekly.push({ "start": sd_str, "end": ed_str });
sd.setDate(ed.getDate() + 1);
} else {
weekly.push({ "start": sd_str, "end": end_dstr });
console.log("OUT");
break;
}
}
console.log(weekly);
return weekly;
}
1楼
RobG
0
已采纳
2015-08-07 03:02:39
正如Bergi指出的,您的问题在这里:
sd.setDate(ed.getDate() + 1);
当ed滴答到下个月时,日期是5,而sd的日期是29。所以这会将sd设置为同一月的 6,所以它不会滴答到下个月的6,但是返回到当前月份的6号。
然后,在循环中,结束日期会重置为原始月份的下一个星期六,随后便是无休止的循环。
替换为:
sd = new Date(ed);
sd.setDate(sd.getDate() + 1);
而且你很好。
下面是一个重构的示例,我更喜欢do..while而不是while(true)
循环,但带有一个中断:
function dString(d) {
function z(n){return (n<10?'0':'')+n}
return z(d.getDate()) + '-' + z(d.getMonth()+1) +'-' + d.getFullYear();
}
function getWeeklyTimePeriod(start_d, end_d) {
var weekly = [],
sd = new Date(start_d),
ed;
do {
ed = new Date(sd);
ed.setDate(ed.getDate() + (6-(ed.getDay())));
weekly.push({ "start": dString(sd), "end": dString(ed) });
sd = new Date(ed);
sd.setDate(sd.getDate() + 1);
} while (ed < end_d)
return weekly;
}
console.log(JSON.stringify(getWeeklyTimePeriod(new Date(2015,7,28), new Date(2015,8,13))));