Created
August 31, 2019 03:23
-
-
Save longfellowone/e5c8b6e9138e14ebca93dcb74dfe3931 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// https://stackoverflow.com/questions/37069186/calculate-working-days-between-two-dates-in-javascript-excepts-holidays | |
$(document).ready(() => { | |
$('#calc').click(() => { | |
var d1 = $('#d1').val(); | |
var d2 = $('#d2').val(); | |
$('#dif').text(workingDaysBetweenDates(d1,d2)); | |
}); | |
}); | |
let workingDaysBetweenDates = (d0, d1) => { | |
/* Two working days and an sunday (not working day) */ | |
var holidays = ['2016-05-03', '2016-05-05', '2016-05-07']; | |
var startDate = parseDate(d0); | |
var endDate = parseDate(d1); | |
// Validate input | |
if (endDate < startDate) { | |
return 0; | |
} | |
// 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); | |
days -= weeks * 2; | |
// Handle special cases | |
var startDay = startDate.getDay(); | |
var endDay = endDate.getDay(); | |
// Remove weekend not previously removed. | |
if (startDay - endDay > 1) { | |
days -= 2; | |
} | |
// Remove start day if span starts on Sunday but ends before Saturday | |
if (startDay == 0 && endDay != 6) { | |
days--; | |
} | |
// Remove end day if span ends on Saturday but starts after Sunday | |
if (endDay == 6 && startDay != 0) { | |
days--; | |
} | |
/* Here is the code */ | |
holidays.forEach(day => { | |
if ((day >= d0) && (day <= d1)) { | |
/* If it is not saturday (6) or sunday (0), substract it */ | |
if ((parseDate(day).getDay() % 6) != 0) { | |
days--; | |
} | |
} | |
}); | |
return days; | |
} | |
function parseDate(input) { | |
// Transform date from text to date | |
var parts = input.match(/(\d+)/g); | |
// new Date(year, month [, date [, hours[, minutes[, seconds[, ms]]]]]) | |
return new Date(parts[0], parts[1]-1, parts[2]); // months are 0-based | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment