Добавить номер. дней в день, чтобы получить следующую дату (исключая выходные)
У меня есть дата, мне нужно добавить нет. дней, чтобы получить будущую дату, но выходные должны быть исключены.
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>