Как создать вхождение даты между двумя датами? - PullRequest
0 голосов
/ 02 октября 2019
Start Date: 2019-03-03

End Date: 2020-03-02

15-дневный разрыв между начальной и конечной датами исключает все пятницы

Точные Ожидаемые выходные данные исключают все пятницы

20-Mar-2019 //i need to start with the date 2019-03-03 dont start with the 20 March 2019
07-Apr-2019
24-Apr-2019
12-May-2019
29-May-2019
16-Jun-2019
03-Jul-2019
21-Jul-2019
07-Aug-2019
25-Aug-2019
11-Sep-2019
29-Sep-2019
16-Oct-2019
03-Nov-2019
20-Nov-2019
08-Dec-2019
25-Dec-2019
12-Jan-2020
29-Jan-2020
16-Feb-2020

в моем коде это не такнаступает 20 марта 2019 года (дата начала, что я даю). Пожалуйста, подскажите, где я ошибся в коде.

http://jsfiddle.net/2mjshr1d/

ФУНКЦИОНАЛЬНЫЙ КОД

function nth(d) {
  if (d > 3 && d < 21) return 'th'; 
  switch (d % 10) {
    case 1:  return "st";
    case 2:  return "nd";
    case 3:  return "rd";
    default: return "th";
  }
}

function dateToYMD(date) { var strArray=['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']; var d = date.getDate(); var m = strArray[date.getMonth()]; var y = date.getFullYear(); return '' + (d <= 9 ? '0' + d : d) + '-' + m + '-' + y; }

Date.prototype.addDays = function(days) {
  var date = new Date(this.valueOf());
  date.setDate(date.getDate() + days);
  return date;
}

var cnt = 0;
function printNextPeriod(startDate, endDate, periodInDays) {
  var numWorkDays = 0;
  var currentDate = new Date(startDate);
  while (numWorkDays < periodInDays && currentDate <= endDate) {
   currentDate = currentDate.addDays(1);
    // Skips friday
    if (currentDate.getDay() !== 5) {
      numWorkDays++;
    }
    if (numWorkDays == periodInDays) {
      numWorkDays = 0;
      cnt++; 
      document.getElementById("first").innerHTML += dateToYMD(currentDate)+"<br/>";
      document.getElementById("second").innerHTML += cnt+nth(cnt)+(cnt==1?" Basic":" Control")+ " Treatment"+"<br/>";

    }
  }
}

var firtsjobstart = new Date("2019-03-03");
var end = new Date("2020-03-02");
var period = 157;
printNextPeriod(firtsjobstart, end, period);

Ответы [ 3 ]

1 голос
/ 02 октября 2019

Я вижу пару проблем в вашем коде.

  1. Вы увеличиваете дату перед проверкой / печатью.
  2. numWorkDays не изменяется так же, как currentDate.
  3. У вас также есть numWorkDays < periodInDays, что неверно.

Чтобы противостоять этой проблеме, я изменил вашу функцию printNextPeriod, которая, кстати, должна называться printNextPeriods

function printNextPeriod(startDate, endDate, periodInDays) {
    var numWorkDays = 0;
    var currentDate = new Date(startDate);
    while (currentDate <= endDate) { // only this condition is enough as you're modifying the currentDate
        // Skips friday
        if (currentDate.getDay() == 5) { // increase the currentDate and the numWorkDays if the currentDay is friday.. 
            currentDate = currentDate.addDays(1);
            numWorkDays++;
        }
        if (0 == numWorkDays % periodInDays) { //if its the same day or the periodInDays'th day..
            numWorkDays = 0;
            cnt++; 
            document.getElementById("first").innerHTML += dateToYMD(currentDate)+"<br/>";
            document.getElementById("second").innerHTML += cnt+nth(cnt)+(cnt==1?" Basic":" Control")+ " Treatment"+"<br/>";

        }
        numWorkDays ++;
        currentDate = currentDate.addDays(1);


    }
}

вот обновленный jsfiddle

0 голосов
/ 02 октября 2019

Для получения даты начала также необходимо убедиться, что условие для печати выполняется на первой итерации, и чтобы дата начала не была пятницей (в противном случае добавьте 1 день).

В качестве дальнейшего улучшения я бы не стал использовать .addDays(1) несколько раз, а выполнял бы математику, чтобы сразу перейти к следующей дате. Это можно сделать, указав, сколько полных недель умещается в интервал-период, и используйте оставшееся количество дней, чтобы узнать, пересекаете ли вы пятницу или нет.

Вот рекомендуемый код:

function printNextPeriod(startDate, endDate, periodInDays) {
    var fullWeeks = Math.floor(periodInDays / 6); // number of weeks that fit in period
    var numWorkDays = periodInDays - fullWeeks * 6; // remaining number of days
    var currentDate = new Date(startDate);
    // Make sure not to start on a Friday
    if (currentDate.getDay() === 5) currentDate = currentDate.addDays(1);

    while (currentDate <= endDate) {
        cnt++; 
        document.getElementById("first").innerHTML += dateToYMD(currentDate)+"<br/" + ">";
        document.getElementById("second").innerHTML += cnt+nth(cnt)+(cnt==1?" Basic":" Control")+ " Treatment"+"<br/" + ">";

        var daysUntilFriday = (12 - currentDate.getDay()) % 7;
        // Add the full weeks (7 days, always bringing you to the same day-of-the-week)
        // Add the remaining number of days
        // Add one extra day if we cross a Friday in that remaining number of days
        currentDate = currentDate.addDays(fullWeeks * 7 + numWorkDays 
                                          + (numWorkDays >= daysUntilFriday));
    }
}
0 голосов
/ 02 октября 2019

это должно хорошо работать

function printNextPeriod(startDate, endDate, periodInDays) {
  var daysRemained = 0;
  var currentDate = new Date(startDate);
  while (currentDate <= endDate) {
    if (daysRemained === 0) {
      cnt++;
      daysRemained = periodInDays
      document.getElementById("first").innerHTML += dateToYMD(currentDate)+"<br/>";
      document.getElementById("second").innerHTML += cnt+nth(cnt)+(cnt==1?" Basic":" Control")+ " Treatment"+"<br/>";  
    }
    // Skips friday
    if (currentDate.getDay() !== 5) {
      daysRemained --;
    }
    currentDate = currentDate.addDays(1);
  }
}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...