Exclude weekends from date / time

I have the following which is great for my needs:

function funLoad(str1,str3,str4) { var dym1 = str1.split("/"); var d=new Date(); var dym2 = d.getMonth() + 1 + "-" + d.getDate() + "-" + d.getFullYear() + " " + d.getHours() + ":" + d.getMinutes() + ":00"; //var dym2 = "6 10 2013 09:00:00"; var start = Date.parse(dym1[1] + "-" + dym1[0] + "-" + dym1[2] + " " + str3 + ":" + str4 + ":00"); var end = Date.parse(dym2); return (start-end) / (1000*60*60); } $("#btn1").click(function(event){ alert(funLoad($("#txt1").val(),$("#ddlHourTime").val(),$("#ddlMinuteTime").val())); }); 

Here is jsfiddle: http://jsfiddle.net/QTVWd/8/

I appreciate that this will probably only work in IE8, but I am developing in an intranet environment where everyone uses only IE8, so this is not a problem. Ignoring this, this script just gets the selected date and time, compares it with the current date / time and returns the clock. All is good so far.

The problem is that it takes into account the weekend. How can I only count hours on weekdays and exclude weekends if the start and end dates include weekends? For example, if the start date is Friday and the end date is Monday, it should only consider hours on Friday and Monday, except for 48 hours on weekends.

+7
source share
2 answers

This function that I worked with in jsfiddle should do what you are looking for. You want to run it through it to make sure that it calculates correctly.

updated jsfiddle

function funLoad (str1, str3, str4) {

 var dym1 = str1.split("/"); // get the given(start) epoch value (using midnight for time - will adjust for actual time further below) var start_date = new Date(dym1[2], (dym1[1]-1), dym1[0], 0, 0, 0, 0); var start_epoch = start_date.getTime(); // get todays(end) epoch value (using midnight for time - will adjust for actual time further below) var end_d = new Date(); var end_epoch = new Date(end_d.getFullYear(), end_d.getMonth(), end_d.getDate(), 0, 0, 0, 0).getTime(); var end_date_is_weekend = (end_d.getDay()==0 || end_d.getDay()==6)?1:0; // get value for 1 day in milliseconds var one_day = 1000*60*60*24; // how many days between given date and todays date var total_days = Math.ceil( (end_epoch - start_epoch ) / one_day)-1; // figure out how many of those total days are weekend days var date_to_check = start_epoch + one_day; var total_weekend_days = 0; var next_day_is_weekend = 0; for(var x=0; x<total_days; x++){ d=new Date(date_to_check); if(d.getDay()==0 || d.getDay()==6){ total_weekend_days++; if(x==0){next_day_is_weekend=1;} } date_to_check += one_day } // determine number of week days var total_week_days = total_days - total_weekend_days; // get the total hours from the total week days var total_hours = total_week_days*24; // still need to add the remaining hours from the given(start) date and the number of hours that have already past in the end(todays) date // add in the remaining hours left in the start date var hours_remaining_in_start_date = 0; // rounding up to next nearest start date hour if(str4 > 30){ if(str3 == 23 && next_day_is_weekend==0){ // rounding up puts the start date into the start of the next day so subtract // one day from the total, UNLESS the next day is a weekend. total_week_days -= 1; hours_remaining_in_start_date = -24; }else{ hours_remaining_in_start_date = 24 - (str3+1); } }else{ hours_remaining_in_start_date = 24 - str3; } total_hours += hours_remaining_in_start_date; // add in the hours from the end date (today date), UNLESS today is a weekend var hours_past_in_end_date = 0; var end_hour = end_d.getHours(); if(end_date_is_weekend==0){ // rounding up to next nearest end date hour if(end_d.getMinutes() > 30){ if(end_hour == 23){ // rounding up makes it a full day hours_past_in_end_date = 24; }else{ // rounding up just adds an hour hours_past_in_end_date = end_hour+1; } }else{ hours_past_in_end_date = end_hour; } } total_hours += hours_past_in_end_date; $('#result').html('start epoch:'+start_epoch+', end epoch:'+end_epoch+', total days'+total_days+', total weekends'+total_weekend_days+', total week days:'+total_week_days+', hours_remaining_in_start_date:'+hours_remaining_in_start_date+', hours_past_in_end_date:'+hours_past_in_end_date+', total hours:'+total_hours); 

}

0
source

This will work:

 var calcWorkHours = function calcWorkHours(start, end) { var total = (end - start) / (1000 * 60 * 60 * 24), // compute difference in days totalDays = parseInt(total, 10), // trim fractional portion remainder = (total - totalDays) * 24, // save fractional portion in hours startingDay = start.getDay(), // starting weekday endingDay = end.getDay(), // ending weekday possibleWorkingDays = (totalDays * 5), actualOccurringWeekends = (startingDay - endingDay) * 2, workDays = (possibleWorkingDays - actualOccurringWeekends) / 7; if (endingDay === 6) { workDays -= 1; // ends on a weekend, subtract a day } if (startingDay === 0) { workDays -= 1; // starts on a weekend, subtract a day } return (workDays * 24) + remainder; // convert to hours and add back fractional portion }, parseInputs = function parseInputs(date, hour, minute) { var dmy = date.split("/"), now = new Date(), thisMinute = now.getMonth() + 1 + "-" + now.getDate() + "-" + now.getFullYear() + " " + now.getHours() + ":" + now.getMinutes() + ":00", start = Date.parse(dmy[1] + "-" + dmy[0] + "-" + dmy[2] + " " + hour + ":" + minute + ":00"), end = Date.parse(thisMinute); start = new Date(start); end = new Date(end); return calcWorkHours(start, end); }; 

See here: http://jsfiddle.net/QTVWd/9/

UPDATE

If you really need a clock expressed as a negative number, just switch the options in calcWorkHours :

 return calcWorkHours(end, start); 
0
source

All Articles