#<Sentry::ErrorEvent:0x00007fee7d4323d0>

JavaScript

const arranged_shifts = [{
	'start_time'  : '08:00',
	'finish_time' : '10:00'
},
{
	'start_time'  : '10:30',
	'finish_time' : '16:00'
},
{
	'start_time'  : '17:00',
	'finish_time' : '18:00'
},
{
	'start_time'  : '19:00',
	'finish_time' : '20:00'
}];

const absences = [{
	'start_time'  : '09:00',
	'finish_time' : '09:30'
},
{
	'start_time'  : '11:00',
	'finish_time' : '12:30'
},
{
	'start_time'  : '17:30',
	'finish_time' : '18:00'
}
];

const available_times = [],
	     add_time        = (start_time, finish_time) => {
	available_times.push({
		'start_time'  : start_time,
		'finish_time' : finish_time
	});
};

const get_time_difference = (a_time, b_time) => {
	return Date.parse('1970/01/01 ' + a_time) - Date.parse('1970/01/01 ' + b_time);
};

absences_loop : for (const absence of absences){
	shift_loop : for (const arranged_shift of arranged_shifts){
		const start_time_difference  = get_time_difference(arranged_shift.start_time, absence.start_time),
					finish_time_difference = get_time_difference(arranged_shift.finish_time, absence.finish_time);

		if (start_time_difference === 0 && finish_time_difference > 0){
			add_time(absence.finish_time, arranged_shift.finish_time);
    }
		else if (start_time_difference < 0 && finish_time_difference > 0){
			add_time(arranged_shift.start_time, absence.start_time);
			add_time(absence.finish_time, arranged_shift.finish_time)
		}
		else if (finish_time_difference === 0 && start_time_difference < 0){
			add_time(arranged_shift.start_time, absence.start_time);
		}
  }
}

console.log(available_times);