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

У меня есть дата, мне нужно добавить нет. дней, чтобы получить будущую дату, но выходные должны быть исключены. iee

input date = "9-DEC-2011";
No. of days to add  = '13';

next date should be "28-Dec-2011"

Здесь выходные (sat/sun) не учитываются.

Ответ 1

Попробуйте это

var startDate = "9-DEC-2011";
startDate = new Date(startDate.replace(/-/g, "/"));
var endDate = "", noOfDaysToAdd = 13, count = 0;
while(count < noOfDaysToAdd){
    endDate = new Date(startDate.setDate(startDate.getDate() + 1));
    if(endDate.getDay() != 0 && endDate.getDay() != 6){
       //Date.getDay() gives weekday starting from 0(Sunday) to 6(Saturday)
       count++;
    }
}
alert(endDate);//You can format this date as per your requirement

Работа Демо

Ответ 2

@ShankarSangoli

Здесь более новая версия, которая не позволяет воссоздать объект Date в каждом цикле, обратите внимание, что он теперь завернут в функцию.

function calcWorkingDays(fromDate, days) {
    var count = 0;
    while (count < days) {
        fromDate.setDate(fromDate.getDate() + 1);
        if (fromDate.getDay() != 0 && fromDate.getDay() != 6) // Skip weekends
            count++;
    }
    return fromDate;
}
alert(calcWorkingDays(new Date("9/DEC/2011"), 13));

Ответ 3

Если вы хотите считать только рабочие дни, это поможет вам.

function countWorkingDays(fromDate, days) {
  var count = 0;
  while (count < days) {
    fromDate.setDate(fromDate.getDate() + 1);
    if (fromDate.getDay() != 0 && fromDate.getDay() != 6) // Skip weekends
        count++;
  }
}
countWorkingDays('06-01-2017',10);

Если вы хотите работать больше с рабочим часом, чем комментарий, и дать мне свою проблему, поэтому я постараюсь решить это.

Ответ 4

Вот элегантное решение без циклической или внешней библиотеки:

function addBusinessDaysToDate(date, days) {
  var day = date.getDay();

  date = new Date(date.getTime());
  date.setDate(date.getDate() + days + (day === 6 ? 2 : +!day) + (Math.floor((days - 1 + (day % 6 || 1)) / 5) * 2));
  return date;
}

var date = "9-DEC-2011";
var newDate = addBusinessDaysToDate(new Date(date.replace(/-/g, "/")), 13);
alert(newDate.toString().replace(/\S+\s(\S+)\s(\d+)\s(\d+)\s.*/, '$2-$1-$3')); // alerts "28-Dec-2011"

Ответ 5

или вы можете быть таким

function addWeekdays(date, weekdays) {
    var newDate = new Date(date.getTime());
    var i = 0;
    while (i < weekdays) {
        newDate.setDate(newDate.getDate() + 1);
        var day = newDate.getDay();
        if (day > 1 && day < 7) {
            i++;
        }
    }
    return newDate;
}
var currentDate = new Date('10/31/2014');
var targetDate = addWeekdays(currentDate, 45);
alert(targetDate);

Ответ 6

Этот вопрос довольно старый, но все предыдущие ответы повторяются в течение нескольких дней. Это может быть неэффективным в течение большого количества дней. Это работает для меня, если days - положительный int, а startDate - рабочий день:

function addWorkingDates(startDate, days) {
    current_day = startDate.getDay() - 1; // Week day, starting on Monday
    weekend_days = 2*parseInt((current_day + days)/5);
    startDate.setDate(changed_to.getDate() + days + weekend_days);
}

Ответ 7

попробуйте это решение

<script language="javascript">

function getDateExcludeWeekends(startDay, startMonth, startYear, daysToAdd) {
var sdate = new Date();
var edate = new Date();
var dayMilliseconds = 1000 * 60 * 60 * 24;
sdate.setFullYear(startYear,startMonth,startDay);
edate.setFullYear(startYear,startMonth,startDay+daysToAdd);
var weekendDays = 0;
while (sdate <= edate) {
    var day = sdate.getDay()
    if (day == 0 || day == 6) {
        weekendDays++;
    }
    sdate = new Date(+sdate + dayMilliseconds);
} 
sdate.setFullYear(startYear,startMonth,startDay + weekendDays+daysToAdd);
return sdate;
}

</script>

Ответ 8

Если вы хотите получить следующий рабочий день, с определенной даты, используйте следующий код...

function getNextWorkingDay(originalDate) {
    var nextWorkingDayFound = false;
    var nextWorkingDate = new Date();
    var dateCounter = 1;

    while (!nextWorkingDayFound) {
        nextWorkingDate.setDate(originalDate.getDate() + dateCounter);
        dateCounter++;

        if (!isDateOnWeekend(nextWorkingDate)) {
            nextWorkingDayFound = true;
        } 
    }

    return nextWorkingDate;
}

function isDateOnWeekend(date) {
    if (date.getDay() === 6 || date.getDay() === 0)
        return true;
    else
        return false;
}

Ответ 9

По какой-то причине мне было более интуитивно, чтобы попробовать это рекурсивно. Эта версия не учитывает праздники, но вы можете изменить функцию isValid, чтобы проверить что-то.

function addWeekdaysToDate(date, numberToAdd) {
  var isValid = function(d) { return d.getDay() !== 0 && d.getDay() !== 6 }
  if(Math.abs(numberToAdd) > 1) {
    return addWeekdaysToDate(
      addWeekdaysToDate(date, Math.sign(numberToAdd)),
      numberToAdd - Math.sign(numberToAdd)
    )
  } else if(Math.abs(numberToAdd) === 1) {
    var result = new Date(date)
    result.setDate(result.getDate() + Math.sign(numberToAdd))
    if(isValid(result)) {
      return result
    } else {
      return addWeekdaysToDate(result, Math.sign(numberToAdd))
    }
  } else if(numberToAdd === 0) {
    return date
  }
  return false
}

console.log(addWeekdaysToDate(new Date(), 1))
console.log(addWeekdaysToDate(new Date(), 5))
console.log(addWeekdaysToDate(new Date(), -7))

Ответ 10

2019

Этот вопрос довольно старый и уже имеет ответ, но я думаю, что есть много людей, которые сейчас используют библиотеку моментов для обработки даты и времени; Итак, вот мое решение для достижения этой цели с использованием библиотеки моментов:

Для пользователя, который использует момент:

const DATE_FORMAT = 'DD-MMM-YYYY';

function addDays(datestring, numberOfDays) {
  const date = moment(datestring, DATE_FORMAT);
  // Weekend occurrence * 2 days
  const weekendCounts = Math.floor(numberOfDays / 5) * 2;
  // If it is Friday, add additional 2 days to skip the weekend
  if (date.day() === 5) {
    return date.add(numberOfDays + weekendCounts + 2, 'days');
  }
  // If it is Saturday, add additional 1 day to skip the weekend
  else if (date.day() === 6) {
    return date.add(numberOfDays + weekendCounts + 1, 'days');
  }
  // Otherwise, add the number of days
  return date.add(numberOfDays + weekendCounts, 'days');
}

addDays('9-DEC-2011', 13); // 28-DEC-2011

Ответ 11

Попробуй это

<html>
<head>


<script type="text/javascript">
function calculate(){
var noOfDaysToAdd = 13;
var startDate = "9-DEC-2011";
startDate = new Date(startDate.replace(/-/g, "/"));
var endDate = ""; 
count = 0;
while(count < noOfDaysToAdd){
endDate = new Date(startDate.setDate(startDate.getDate() + 1));
if(endDate.getDay() != 0 && endDate.getDay() != 6)
{
count++;
}
}
document.getElementById("result").innerHTML = endDate;
}
</script>
</head>
<body>
<div>
Date of book delivery: <span id="result"></span><br /><br />
<input type="button" onclick="calculate();" value="Calculate"/>
<br>
<br>
</div>
</body>
</html>