当前位置: 代码迷 >> JavaScript >> 如果Javascript数组大小> 4,则Safari会挂起
  详细解决方案

如果Javascript数组大小> 4,则Safari会挂起

热度:28   发布时间:2023-06-05 15:53:41.0

给定startend日期,我试图创建一个数组,其中包含开始和结束日期之间所有星期的startend日期。

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;
}

正如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))));
  相关解决方案