count 45 Working days after a selected date in javascript - javascript

I have one date parameter. 31 October 2014. i want to get next days = 45 days after 31 October 2014. So it should be 2 Januari 2015. and excluding Saturday and Sunday.
I already make the function like this. But when i add 45. the 45 not excluding Saturday and Sunday.
function getNextBusinessDay() {
return getDeliveryDateObj(1);
}
function getDeliveryDateObj(businessDaysLeftForDelivery) {
var now = new Date();
var dayOfTheWeek = now.getDay();
now.setDate(now.getDate() + 45);
var calendarDays = businessDaysLeftForDelivery;
var deliveryDay = dayOfTheWeek + businessDaysLeftForDelivery;
if (deliveryDay >= 6) {
businessDaysLeftForDelivery -= 6 - dayOfTheWeek; //deduct this-week days
calendarDays += 2; //count this coming weekend
deliveryWeeks = Math.floor(businessDaysLeftForDelivery / 5); //how many whole weeks?
calendarDays += (deliveryWeeks * 2); //two days per weekend per week
}
now.setTime(now.getTime() + calendarDays * 24 * 60 * 60 * 1000);
return now;
}

This addWeekdays function should do what you want.
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);

Here's how I solved my problem:
function test() {
var startDate = "31-oct-2014";
startDate = new Date(startDate.replace(/-/g, "/"));
var endDate = "", noOfDaysToAdd = 45, count = 0;
while (count < noOfDaysToAdd) {
endDate = new Date(startDate.setDate(startDate.getDate() + 1));
if (endDate.getDay() != 0 && endDate.getDay() != 6) {
count++;
}
}
$("#Test").val(endDate);
}

Related

Return list of date between specific range selected from datepicker (include and exclude weekends)

I try to code with JavaScript and now, I have another problem. The intended goal is to calculate the number of days and to return list of those date between two selected dates from datepicker. The trick is: the system should provide two option: during all day of the week (including Saturday and Sunday) and only during working days. I tried to do this on my own, but I am stuck. I have also tried to find out if anyone happened to asked the same question, but the result is no. Here is my code. Can anyone help me with this? Thank you!
$("#calculate").click(function() {
// TO CALCULATE TOTAL DAYS
startdate.setHours(0, 0, 0, 1);
enddate.setHours(23, 59, 59, 999);
var days = Math.ceil(enddate - startdate) / (1000 * 60 * 60 * 24);
var weeks = Math.floor(days / 7);
days = days - (weeks * 2);
var month = startdate.getMonth();
var day = startdate.getDate();
var year = startdate.getFullYear();
// ONLY DURING WORKING DAYS
$("#weekday").change(function() {
if ($(this).is(':checked')) {
var startday = startdate.getDay();
var endday = enddate.getDay();
if (startday - endday > 1) {
days = days - 2
}
if (startday == 0 && endday != 6) {
days = days - 1
}
if (endday == 6 && startday != 0) {
days = days - 1
}
// TO SHOW THE LIST OF DATE BETWEEN START AND END DATE
while (startdate <= enddate) {
if (startday < 6 && startday > 0) {
month = startdate.getMonth() + 1
}
if (month <= 9) {
month = "0" + month
}
var day = startdate.getdate();
if (day <= 9) {
day = "0" + day
}
}
startdate.setDate(startdate.getDate() + 1);
}
})
})
var quantity = $("#quantity").val();
var delivery = Math.round(quantity / days);
var datearray = document.write(day + "." + month + "." + startdate.getFullYear());
if (enddate < startdate) {
alert("Start date must be earlier than end date!")
} else if (quantity == 0) {
alert("Quantity must be bigger than 0")
} else {
append("<br>Total " + days + " selected days<br/>");
append("<br>Shipment" + delivery + " pc(s) per day<br/>");
append("<br>During period of" + datearray + "<br/>")
}
});

Calculate weekdays and weekends count between two dates without considering daylight saving - javascript

Due to daylight saving time in London, I'm not able to get the correct count for weekdays and weekend days. In the below fiddle 26/10/2019 is considering at times as weekday and at times as a weekend.
I want to get the output for the below fiddle is
"workingDays": 1,
"weekendDays": 2
Any suggestions, please?
var startDate = new Date('2019-10-26');
var endDate = new Date('2019-10-28');
var workingDays = number_of_working_days(startDate, endDate);
var weekendDays = number_of_weekend_days(startDate, endDate);
console.log({
'workingDays': workingDays,
'weekendDays': weekendDays
})
function number_of_working_days(startDate, endDate) {
var workingDays = 0;
for (var i = startDate; i <= endDate; i = i + (60 * 60 * 24)) {
if (i.getDay() <= 5) {
workingDays = workingDays + 1;
}
}
return workingDays;
}
function number_of_weekend_days(startDate, endDate) {
var weekendDays = 0;
for (var i = startDate; i <= endDate; i = i + (60 * 60 * 24)) {
if (i.getDay() > 5) {
weekendDays = weekendDays + 1;
}
}
return weekendDays;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

javascript Date count validation - Last 3 months

I populate 2 dates 03-Mar-2015 and 03-Jun-2015, if Last 3 months option is selected.I perform the below JavaScript validation to check for 90 days. But it shows validation error that the two dates selected are greater than 90 days. But my constraint is not allow users to select more than 3 months duration.
function DtTimeDiff(sender, args) {
var startDate = Date.parse(document.getElementById('ctl00$MainContent$FromYearTxt').value);
var endDate = Date.parse(document.getElementById('ctl00$MainContent$ToYearTxt').value);
var timeDiff = endDate - startDate;
daysDiff = Math.floor(timeDiff / (1000 * 60 * 60 * 24));
if (daysDiff > 90) {
args.IsValid = false;
}
else {
args.IsValid = true;
}
}
How to perform validation for 3 months having 91 days(Mar,Apr,May) and 92 days (Jul,Aug,Sep)? Constrain is not allow users to select more than 3 months duration.
You can add the intermediate code to compute the month duration based on the dates:
function DtTimeDiff() {
var startDate = new Date(document.getElementById('ctl00$MainContent$FromYearTxt').value);
var endDate = new Date(document.getElementById('ctl00$MainContent$ToYearTxt').value);
var monthsDiff = endDate.getMonth() - startDate.getMonth();
var durationLimit = 0;
for (i = 1; i <= monthsDiff; i++) {
durationLimit += new Date(startDate.getFullYear(), startDate.getMonth() + i, 0).getDate();
}
var timeDiff = endDate.getTime() - startDate.getTime();
var daysDiff = Math.floor(timeDiff / (1000 * 60 * 60 * 24));
if (daysDiff > durationLimit) {
args.IsValid = false;
} else {
args.IsValid = true;
}
}
You can try calculate month and date separately
function DtTimeDiff(sender, args) {
startDate = new Date("03-03-2015");/*Assume format is MM-DD-YYYY*/
endDate = new Date("06-01-2015");/*Assume format is MM-DD-YYYY*/
var timeDiff = endDate - startDate;
startDateMonth = startDate.getMonth() + 1;
endDateMonth = endDate.getMonth() + 1;
startDateDate = startDate.getDate();
endDateDdate = endDate.getDate();
if (endDateMonth - startDateMonth >= 3) {
if (endDateDdate - startDateDate >= 0) {
args.IsValid = true;
console.log("In");
} else {
args.IsValid = false;
console.log("Out");
}
}
}

How to calculate the total days between two selected calendar dates

Let say i have startDate = 7/16/2015 and endDate = 7/20/2015. This 2 dates are stored in a SharePoint list.
If user select the exact date with the date in SharePoint list, it can calculate the total days = 2 , which means that without calculate on the other days.
Anyone can please help on this?
I use the following code to calculate the total day of difference without counting on weekend. But I cant figure out the way how to calculate the total day of selected date without counting on other days.
function workingDaysBetweenDates(startDate,endDate) {
// Validate input
if (endDate < startDate)
return 'Invalid !';
// Calculate days between dates
var millisecondsPerDay = 86400 * 1000; // Day in milliseconds
startDate.setHours(0,0,0,1); // Start just after midnight
endDate.setHours(23,59,59,999); // End just before midnight
var diff = endDate - startDate; // Milliseconds between datetime objects
var days = Math.ceil(diff / millisecondsPerDay);
// Subtract two weekend days for every week in between
var weeks = Math.floor(days / 7);
var days = days - (weeks * 2);
// Handle special cases
var startDay = startDate.getDay();
var endDay = endDate.getDay();
// Remove weekend not previously removed.
if (startDay - endDay > 1)
days = days - 2;
// Remove start day if span starts on Sunday but ends before Saturday
if (startDay == 0 && endDay != 6)
days = days - 1;
// Remove end day if span ends on Saturday but starts after Sunday
if (endDay == 6 && startDay != 0)
days = days - 1;
return days;
}
The following function calculates the number of business days between two dates
function getBusinessDatesCount(startDate, endDate) {
var count = 0;
var curDate = startDate;
while (curDate <= endDate) {
var dayOfWeek = curDate.getDay();
if(!((dayOfWeek == 6) || (dayOfWeek == 0)))
count++;
curDate.setDate(curDate.getDate() + 1);
}
return count;
}
//Usage
var startDate = new Date('7/16/2015');
var endDate = new Date('7/20/2015');
var numOfDates = getBusinessDatesCount(startDate,endDate);
$('div#result').text(numOfDates);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="result"/>
First you have to calculate the difference in time, then convert the time to days
var calculateDifference = function(date1, date2){
var timeDifference = Math.abs(date2.getTime() - date1.getTime());
return Math.ceil(timeDifference / (1000 * 3600 * 24));//ms * seconds * hours
}
var difference = calculateDifference(new Date("7/16/2015"), new Date("7/20/2015"));
untested, but should work...
Using moment startDate and endDate:
function getBusinessDaysCount(startDate, endDate) {
let relativeDaySequence = [...Array(endDate.diff(startDate, "days")).keys()];
let daySequence = relativeDaySequence.map(relativeDay => {
let startDateClone = startDate.clone();
return startDateClone.add(relativeDay, "days");
});
return daySequence.reduce(
(dayCount, currentDay) => dayCount + (currentDay.day() === 0 || currentDay.day() === 6 ? 0 : 1),
0
);
}
Can Try this it will also work.
//fromDate is start date and toDate is end Date
var timeDiff = Math.abs(toDate.getTime() - fromDate.getTime());
var diffDays = Math.ceil(timeDiff / (1000 * 3600 * 24)) ;
// var startDay = fromDate.getDay();
debugger;
var diffDayWeek = diffDays + fromDate.getDay();
var diffDiv = Math.floor(parseInt(diffDayWeek/7));
diffDiv *= 2; "Saturday and Sunday are Weekend
diffDays += 1 - diffDiv;

Find day difference between two dates (excluding weekend days)

Hi i am using jquery-ui datepicker to select date and date.js to find difference between 2 dates.
Right now the problem is I want to exclude weekend days from calculation (saturday and sunday). How should i do that?
For example the user select start date (13/8/2010) and end date (16/8/2010). Since 14/8/2010 and 15/8/2010 is in week days, instead of 4 days total, i want it to be only 2 days.
This is the code im using right now:
<script type="text/javascript">
$("#startdate, #enddate").change(function() {
var d1 = $("#startdate").val();
var d2 = $("#enddate").val();
var minutes = 1000*60;
var hours = minutes*60;
var day = hours*24;
var startdate1 = getDateFromFormat(d1, "d-m-y");
var enddate1 = getDateFromFormat(d2, "d-m-y");
var days = 1 + Math.round((enddate1 - startdate1)/day);
if(days>0)
{ $("#noofdays").val(days);}
else
{ $("#noofdays").val(0);}
});
</script>
Maybe someone else can help you converting this function into JQuery's framework...
I found this function here.
function calcBusinessDays(dDate1, dDate2) { // input given as Date objects
var iWeeks, iDateDiff, iAdjust = 0;
if (dDate2 < dDate1) return -1; // error code if dates transposed
var iWeekday1 = dDate1.getDay(); // day of week
var iWeekday2 = dDate2.getDay();
iWeekday1 = (iWeekday1 == 0) ? 7 : iWeekday1; // change Sunday from 0 to 7
iWeekday2 = (iWeekday2 == 0) ? 7 : iWeekday2;
if ((iWeekday1 > 5) && (iWeekday2 > 5)) iAdjust = 1; // adjustment if both days on weekend
iWeekday1 = (iWeekday1 > 5) ? 5 : iWeekday1; // only count weekdays
iWeekday2 = (iWeekday2 > 5) ? 5 : iWeekday2;
// calculate differnece in weeks (1000mS * 60sec * 60min * 24hrs * 7 days = 604800000)
iWeeks = Math.floor((dDate2.getTime() - dDate1.getTime()) / 604800000)
if (iWeekday1 < iWeekday2) { //Equal to makes it reduce 5 days
iDateDiff = (iWeeks * 5) + (iWeekday2 - iWeekday1)
} else {
iDateDiff = ((iWeeks + 1) * 5) - (iWeekday1 - iWeekday2)
}
iDateDiff -= iAdjust // take into account both days on weekend
return (iDateDiff + 1); // add 1 because dates are inclusive
}
var date1 = new Date("August 11, 2010 11:13:00");
var date2 = new Date("August 16, 2010 11:13:00");
alert(calcBusinessDays(date1, date2));
## EDITED ##
If you want to use it with your that format just:
Your code will look like:
function calcBusinessDays(dDate1, dDate2) { // input given as Date objects
var iWeeks, iDateDiff, iAdjust = 0;
if (dDate2 < dDate1) return -1; // error code if dates transposed
var iWeekday1 = dDate1.getDay(); // day of week
var iWeekday2 = dDate2.getDay();
iWeekday1 = (iWeekday1 == 0) ? 7 : iWeekday1; // change Sunday from 0 to 7
iWeekday2 = (iWeekday2 == 0) ? 7 : iWeekday2;
if ((iWeekday1 > 5) && (iWeekday2 > 5)) iAdjust = 1; // adjustment if both days on weekend
iWeekday1 = (iWeekday1 > 5) ? 5 : iWeekday1; // only count weekdays
iWeekday2 = (iWeekday2 > 5) ? 5 : iWeekday2;
// calculate differnece in weeks (1000mS * 60sec * 60min * 24hrs * 7 days = 604800000)
iWeeks = Math.floor((dDate2.getTime() - dDate1.getTime()) / 604800000)
if (iWeekday1 < iWeekday2) { //Equal to makes it reduce 5 days
iDateDiff = (iWeeks * 5) + (iWeekday2 - iWeekday1)
} else {
iDateDiff = ((iWeeks + 1) * 5) - (iWeekday1 - iWeekday2)
}
iDateDiff -= iAdjust // take into account both days on weekend
return (iDateDiff + 1); // add 1 because dates are inclusive
}
$("#startdate, #enddate").change(function() {
var d1 = $("#startdate").val();
var d2 = $("#enddate").val();
var minutes = 1000 * 60;
var hours = minutes * 60;
var day = hours * 24;
var startdate1 = new Date(d1);
var enddate1 = new Date(d2);
var newstartdate = new Date();
newstartdate.setFullYear(startdate1.getYear(), startdate1.getMonth(), startdate1.getDay());
var newenddate = new Date();
newenddate.setFullYear(enddate1.getYear(), enddate1.getMonth(), enddate1.getDay());
var days = calcBusinessDays(newstartdate, newenddate);
if (days > 0) {
$("#noofdays").val(days);
} else {
$("#noofdays").val(0);
}
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<label>Start Date
<input type="date" id="startdate" value="2019-03-03"/>
</label>
<label>End Date
<input type="date" id="enddate" value="2019-03-06"/>
</label>
<label>N. of days
<output id="noofdays"/>
</label>
To do this, you should NOT search all days between these dates !
It's not complicated, look some evident assumptions:
All full-week has 7-days.
Which 2 are weekend-days.
And which 5 are business-day.
Evident conclusions:
Look all days is loss of time.
Check what day is weekend to all week is loss of time.
Without tedious explanation.. let me show the code:
function getBusinessDateCount (startDate, endDate) {
var elapsed, daysBeforeFirstSaturday, daysAfterLastSunday;
var ifThen = function (a, b, c) {
return a == b ? c : a;
};
elapsed = endDate - startDate;
elapsed /= 86400000;
daysBeforeFirstSunday = (7 - startDate.getDay()) % 7;
daysAfterLastSunday = endDate.getDay();
elapsed -= (daysBeforeFirstSunday + daysAfterLastSunday);
elapsed = (elapsed / 7) * 5;
elapsed += ifThen(daysBeforeFirstSunday - 1, -1, 0) + ifThen(daysAfterLastSunday, 6, 5);
return Math.ceil(elapsed);
}
function calc() {
let start = document.querySelector('#startDate').value,
end = document.querySelector('#endDate').value,
result = getBusinessDateCount(new Date(start), new Date(end));
document.querySelector('#result').value = result;
}
Start date: <input type="date" id="startDate" value="2020-01-04"><br>
End date: <input type="date" id="endDate" value="2020-01-06"><br>
<input type="button" onclick="calc()" value="Get business days"><br>
Business days: <input id="result" readonly>
You can test it yourself with any dates.
I just want to notice that this code ONLY consumed 0.43 sec between dates from 2000 to 2015... It is much more fast than some other codes.
Hope it helps...
Nice coding !!
This is how I would do it
function getDays(d1, d2) {
var one_day=1000*60*60*24;
var d1_days = parseInt(d1.getTime()/one_day) - 1;
var d2_days = parseInt(d2.getTime()/one_day);
var days = (d2_days - d1_days);
var weeks = (d2_days - d1_days) / 7;
var day1 = d1.getDay();
var day2 = d2.getDay();
if (day1 == 0) {
days--;
} else if (day1 == 6) {
days-=2;
}
if (day2 == 0) {
days-=2;
} else if (day2 == 6) {
days--;
}
days -= parseInt(weeks) * 2;
alert(days);
}
getDays(new Date("June 8, 2004"),new Date("February 6, 2010"));
EDIT
To clarify my comment to #keenebec...
That solution will work for small date differences quite nicely and is easy to understand. But take something as "short" as a 6 year span and you can see a remarkable difference in speed.
http://jsfiddle.net/aSvxv/
I included all 3 answers and the original answer is indeed the fastest, but not by much and the trade off for a few microseconds of execution is somewhat trivial to me in favor of readability.
Date.prototype.addDays = function(days) {
var date = new Date(this.valueOf())
date.setDate(date.getDate() + days);
return date;
}
function getBusinessDatesCount(startDate, endDate) {
var count = 0;
var curDate = startDate;
while (curDate <= endDate) {
var dayOfWeek = curDate.getDay();
var isWeekend = (dayOfWeek == 6) || (dayOfWeek == 0);
if(!isWeekend)
count++;
curDate = curDate.addDays(1);
}
return count;
}
//Usage
var startDate = new Date('7/16/2015');
var endDate = new Date('7/20/2015');
var numOfDays = getBusinessDatesCount(startDate,endDate);
jQuery('div#result').text(numOfDays);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="result"/>
That looks like too much work to me. I'd rather let the computer do the heavy lifting-
//
Date.bizdays= function(d1, d2){
var bd= 0, dd, incr=d1.getDate();
while(d1<d2){
d1.setDate(++incr);
dd= d1.getDay();
if(dd%6)++bd;
}
return bd;
}
//test
var day1= new Date(2010, 7, 11), day2= new Date(2010, 7, 31);
alert(Date.bizdays(day1, day2))
To understand way.,
Actual days = 14
weeks for Actual days = 14/7=2
Weekends per week=2
Total weekends=2*weeks for days
So apply this ,
$('#EndDate').on('change', function () {
var start = $('#StartDate').datepicker('getDate');
var end = $('#EndDate').datepicker('getDate');
if (start < end) {
var days = (end - start) / 1000 / 60 / 60 / 24;
var Weeks=Math.round(days)/7;
var totalWeekends=Math.round(Weeks)*2;
var puredays=Math.round(days)-totalWeekends;
$('#days').text(Math.round(puredays) + "Working Days");
}
else {
alert("");
}
Thank you !
Important: Most answers here don't actually work if the start date (or sometimes the end date) is a saturday or sunday. I took the accepted response and modified it so that this issue is resolved now:
var dateDiff;
if (dateTo < dateFrom) return -1; // error code if dates transposed
var dateFromDayOrig = dateFrom.getDay(); // day of week
var dateToDayOrig = dateTo.getDay();
var dateFromDay = (dateFromDayOrig == 0) ? 7 : dateFromDayOrig; // change Sunday from 0 to 7
var dateToDay = (dateToDayOrig == 0) ? 7 : dateToDayOrig;
dateFromDay = (dateFromDay > 5) ? 5 : dateFromDay; // only count weekdays
dateToDay = (dateToDay > 5) ? 5 : dateToDay;
// calculate differnece in weeks (1000mS * 60sec * 60min * 24hrs * 7 days = 604800000)
var weekDifference = Math.floor((dateTo.getTime() - dateFrom.getTime()) / 604800000);
if (dateFromDay <= dateToDay) {
dateDiff = (weekDifference * 5) + (dateToDay - dateFromDay);
} else {
dateDiff = ((weekDifference + 1) * 5) - (dateFromDay - dateToDay);
}
// fix: remove one day if it's saturday or sunday
if (dateFromDayOrig >= 6 || dateFromDayOrig == 0) {
dateDiff--;
}
return (dateDiff + 1); // add 1 because dates are inclusive
There seems to be few issues with the response that has been marked as solution.
The statement setFullYear() is returning incorrect value if I choose start date as 06/11/2015. So instead, the startDate1 and endDate1 can be directly passed to the function.
If the start date is Saturday or Sunday, still the code is counting it(iWeekday1) as 5 days
If the end date is Saturday or Sunday, still the code is counting it(iWeekday2) as 5 days. But these 5 days already get counted in the iweeks calculation.
So instead of
iWeekday1 = (iWeekday1 > 5) ? 5 : iWeekday1; // only count weekdays
iWeekday2 = (iWeekday2 > 5) ? 5 : iWeekday2;
it should be
iWeekday1 = (iWeekday1 > 5) ? 0 : iWeekday1; // only count weekdays
iWeekday2 = (iWeekday2 > 5) ? 0 : iWeekday2;
The last IF condition should be executed when start and end date day is same like both are on same day, the date could be different
if (iWeekday1 <= iWeekday2)
The condition that adjusts if both days are weekends can be removed
iDateDiff -= iAdjust
Lastly, the +1 should be done only if start and end date falls on weekdays. Currently, it is adding in both the cases.
return (iDateDiff + 1);//Add condition to apply only if both days are weekdays
--can't comment on that answer as I do not have that reputation :)
I get it work with this code. Note that the function is from date.js and businessday js (thanks to Garis Suero). Start Date 11-08-2010 End Date 16-08-2010 will result 4 days of leave.
<script type="text/javascript">
$("#startdate, #enddate").change(function() {
var d1 = $("#startdate").val();
var d2 = $("#enddate").val();
var minutes = 1000*60;
var hours = minutes*60;
var day = hours*24;
var startdate1 = getDateFromFormat(d1, "d-m-y");
var enddate1 = getDateFromFormat(d2, "d-m-y");
var days = calcBusinessDays(new Date(startdate1),new Date(enddate1));
if(days>0)
{ $("#noofdays").val(days);}
else
{ $("#noofdays").val(0);}
});
</script>
What I did
function calcbusinessdays()
{
for(var c=0,e=0,d=new Date($("#startdate").val()),a=(new Date($("#enddate").val())-d)/864E5;0<=a;a--)
{
var b=new Date(d);
b.setDate(b.getDate()+a);
1==Math.ceil(b.getDay()%6/6)?c++:e++
}
$("#noofdays").html(c)
};
c is weekdays, e is weekends
function addDays(date, days) {
var result = new Date(date);
result.setDate(result.getDate() + days);
return result;
}
var currentDate;
selectFlixbleDates = [];
var monToSatDateFilter=[];
currentDate=new Date(date);
while(currentDate){
console.log("currentDate"+currentDate);
if(new Date(currentDate).getDay()!=0){
selectFlixbleDates.push(currentDate)
}
if(selectFlixbleDates.length==$scope.numberOfDatePick)
{
break;
}
currentDate=addDays(currentDate,1);
}
for (var i = 0; i < selectFlixbleDates.length; i++) {
// console.log(between[i]);
monToSatDateFilter.push((selectFlixbleDates[i].getMonth() + 1) + '/' + selectFlixbleDates[i].getDate() + '/' + selectFlixbleDates[i].getFullYear());
}
var endDate=monToSatDateFilter.slice(-1).pop();
var space =monToSatDateFilter.join(', ');
var sdfs= document.getElementById("maxPicks").value =space;
$scope.$apply(function() {
$scope.orderEndDate=monToSatDateFilter.slice(-1).pop()
$scope.orderStartDate=monToSatDateFilter[0];
});
document.getElementById("startDateEndDate").innerHTML =$scope.orderStartDate+ ' TO ' +$scope.orderEndDate
}
I have used Angular framework and Moment.js library to implement the solution.
My solution covers all the cases.
this.daysInBetween = this.endMoment.diff(this.startMoment, 'days') + 1;
this.weeksInBetween = this.endMoment.diff(this.startMoment, 'weeks');
this.weekDays = this.daysInBetween - (this.weeksInBetween * 2);
if ( (this.startMoment.day() === 0 && this.endMoment.day() === 6) ||
(this.startMoment.day() > this.endMoment.day()) ) {
// IF ONE WEEKEND WAS MISSED
this.weekDays-=2;
} else if ( this.startMoment.day() <= this.endMoment.day() &&
( this.startMoment.day() === 0 || this.startMoment.day() === 6 ||
this.endMoment.day() === 0 || this.endMoment.day() === 6) ) {
// IF EITHER OF DAYS WAS A WEEKEND
this.weekDays--;
}
Live Demo:
Calculate number of weekdays
I am currently working on a blog to write about my approach to this
specific problem. I will post the link to the blog on the comment.
Important: Most answers here don't actually work if the start date (or sometimes the end date) is a saturday or sunday.
For example: if your start and end date are
Saturday to Sunday or vice versa
or Saturday to Saturday
or Sunday to Sunday
So, here is the modified answer from the accepted answer
function calculateBusinessDays(dDate1, dDate2) {
var iWeeks, iDateDiff, iAdjust = 0;
if (dDate2 < dDate1) {
return -1;
}
var iWeekday1 = dDate1.getDay();
var iWeekday2 = dDate2.getDay();
iWeekday1 = (iWeekday1 === 0) ? 7 : iWeekday1;
iWeekday2 = (iWeekday2 === 0) ? 7 : iWeekday2;
if (iWeekday1 > 5 && iWeekday2 <= 6) {
iWeekday1 = 0;
iAdjust = 1;
}
iWeekday2 = (iWeekday1 === 0 && iWeekday2 === 6) ? 0 : iWeekday2;
if ((iWeekday1 > 5) && (iWeekday2 > 5)) iAdjust = 1;
iWeekday1 = (iWeekday1 > 5) ? 5 : iWeekday1;
iWeekday2 = (iWeekday2 > 5) ? 5 : iWeekday2;
iWeeks = Math.floor((dDate2.getTime() - dDate1.getTime()) / 604800000);
if (iWeeks===0 && iWeekday1===0 && iWeekday2===0
&& (dDate2.getTime() !== dDate1.getTime()) ) {
iWeeks = 1;
}
if (iWeekday1 <= iWeekday2) {
iDateDiff = (iWeeks * 5) + (iWeekday2 - iWeekday1)
} else {
iDateDiff = ((iWeeks + 1) * 5) - (iWeekday1 - iWeekday2)
}
iDateDiff -= iAdjust
return (iDateDiff + 1);
}

Categories

Resources