2

我有一个应用程序,我要求用户在一个月内选择 2 天。4 号或 18 号。当用户选择了这个值时,我会采用该值以及今天的日期。

在我做任何处理之前,我需要增加 25 天的管理工作时间。

day = parseInt(day);
var curDateTime = new Date().getTime(),
timeToAdd = (1000*60*60*24*25),
datePlusDays = new Date(),
finalDate = new Date();

datePlusDays.setTime(timeToAdd + curDateTime);

function incrementToSelected(toIncrement, incrementTo){
    var currentDay = parseInt(toIncrement.getDate());

    if (currentDay != incrementTo){
        var addedDay = new Date();
        addedDay.setTime(toIncrement.getTime() + (1000*60*60*24));
        incrementToSelected(addedDay, incrementTo );
    } else if (currentDay === incrementTo){
        finalDate = toIncrement;
    }
}

incrementToSelected(datePlusDays, day);

datePlusDays 现在是今天的日期 + 25 天。现在,我需要找到用户选择的下一次出现的日期。

目前,我正在使用上面的方法将一天(1000 * 60 * 60 * 24)添加到日期并检查这是否是下一个事件,如果不是添加另一个,是否设置 finalDate 日期.

这确实有效,但在某些情况下,我会收到最大调用堆栈大小超出错误。有没有其他方法可以找到下一次出现的日期?

4

3 回答 3

1

无需弄乱时间戳。这将做你想要的。它将日期设置为“incrementTo”,并有条件地增加月份(如果 incrementTo <= 当前日期)和必要时增加年份(如果月份是 12 月,则滚动到 1 月并增加年份)。

function incrementToSelected(toIncrement, incrementTo){
    if (toIncrement.getDate() >= incrementTo) {
        toIncrement.setDate(1); // Avoid month-rollover edge case
        var m = toIncrement.getMonth();
        if (m == 11) {
            toIncrement.setFullYear(toIncrement.getFullYear()+1);
            toIncrement.setMonth(0);
        } else {
            toIncrement.setMonth(m + 1);
        }
    }
    toIncrement.setDate(incrementTo);
}
于 2013-05-16T10:54:28.317 回答
0

使用 Date 函数自动滚动数月和数年这一事实更加简单......

function Dday (admin, day) {
  var nextDate = new Date();
  nextDate.setDate (nextDate.getDate () + (admin || 25)); // add on the 25 days

  // Caution if day is not within range 1-31 this loop is infinite!
  while (nextDate.getDate () != (day || 4)) // keep adding 1 day till date == day.
    nextDate.setDate (nextDate.getDate () + 1);

  return nextDate;
}

我已经使该函数采用两个可选参数,admin管理天数默认为 25day天,默认为 4 天。

于 2013-05-16T12:47:36.797 回答
-1

我已经采用了 Steven 的贡献,现在可以使用以下方法。

我已经在这个方法中消除了对函数的需求,当它真的是一个相当简单的技术时,我把它复杂化了。

day = parseInt(day);
var curDateTime = new Date().getTime(),
    timeToAdd = (1000*60*60*24*25),
    datePlusDays = new Date(timeToAdd + curDateTime);

if (day >= datePlusDays.getDate()){
    datePlusDays.setDate(day);
} else if (day < datePlusDays.getDate()){
    var m = datePlusDays.getMonth();
    if (m == 11){
        datePlusDays.setFullYear(datePlusDays.getFullYear() + 1);
        datePlusDays.setMonth(0);
    } else {
        datePlusDays.setMonth(datePlusDays.getMonth() + 1);
    }
    datePlusDays.setDate(day);
}

return datePlusDays;
于 2013-05-16T11:57:02.020 回答