function isOutOfTimeRange(time, start, end) {
var date = time.format('YYYY-MM-DD');
var startDate = date + ' ' + start;
var endDate = date + ' ' + end;
if (!time.isBetween(startDate, endDate, 'minute')) {
var timeFormatted = time.format('YYYY-MM-DD HH:mm');
// If the time is exactly start or end time it should be ok to use
if ((timeFormatted === startDate) || (timeFormatted === endDate)) {
return false;
}
return true;
}
return false;
}
function isOutOfHours(time, businessHrs) {
var day = time.day();
var dayStart = businessHrs[day].start;
var dayEnd = businessHrs[day].end;
return isOutOfTimeRange(time, dayStart, dayEnd);
}
function getMinsWorked(startTime, endTime) {
return moment.duration(endTime.diff(startTime)).as('minutes');
}
function minutesWorked(startJob, endJob, bizHrs) {
var start = moment(startJob);
var end = moment(endJob);
// return early if the start and end time range is invalid
if (end.isBefore(start, 'second')) {
return 'A job cannot start after it has ended!';
}
// return early if start or end is not within business hours
if (isOutOfHours(start, bizHrs) || isOutOfHours(end, bizHrs)) {
console.log('The start and end date must not be out of hours');
}
var timeDiff = moment.duration(end.diff(start));
var firstDay = start.day();
var lastDay = end.day();
// return early if we can make a quick calculation on the same day
if (firstDay === lastDay) {
// create a duration object by diffing the end and start dates and return as minutes
return timeDiff.as('minutes');
}
var totalMinsWorked = 0;
var endTime;
var startTime;
for (var i = firstDay; i <= lastDay; ++i) {
var currentDay = start.add(i - firstDay, 'days');
var dateStr = currentDay.format('YYYY-MM-DD');
var dayStart = moment(dateStr + ' ' + bizHrs[i].start);
var dayEnd = moment(dateStr + ' ' + bizHrs[i].end);
// it's the last day so diff the end time from the start
if (i === lastDay) {
totalMinsWorked += getMinsWorked(dayStart, end);
}
// it's the first day so go from the start time
if (i === firstDay) {
totalMinsWorked += getMinsWorked(start, dayEnd);
}
// its a centre day so just get the dif of the start to the end
totalMinsWorked += getMinsWorked(dayStart, dayEnd);
}
return totalMinsWorked;
}
console.log(minutesWorked('2018-05-16 10:00', '2018-05-16 12:30', [{ // index 0 is Sunday
start: '10:00',
end: '14:00'
},
{
start: '08:00',
end: '18:00'
},
{
start: '08:00',
end: '18:00'
},
{
start: '08:00',
end: '18:00'
},
{
start: '08:00',
end: '18:00'
},
{
start: '08:00',
end: '18:00'
},
{ // index 6 is Sat
start: '10:00',
end: '14:00'
}
]));
<script src="https://momentjs.com/downloads/moment.js"></script>