Есть таблица
песочница
В какие-то временные промежутки заданные в ней она работает как надо, а порой не реагирует на значения, которые заданы
// определяем коллекции
let timeCell = document.getElementsByClassName('time'),
healthCell = document.getElementsByClassName('health'),
statusCell = document.getElementsByClassName('status'),
takeCell = document.getElementsByClassName('take'),
timerId;
//для того чтобы получить время с набора, образуем числовой массив, убрав все кроме чисел и приведя каждый элемент массива к Number
//console.log( takeCell[2].innerText.match(/\d{2}/g),takeCell[2].innerText.match(/\d{2}/g).map(e=>parseInt(e)),(takeCell[2].innerText.match(/\d{2}/g).map(e=>parseInt(e)))[2] )
(function t() {
[].slice.call(timeCell).map((e,i)=>{
if(healthCell[i].innerText!=='болен') {
//дефолтное состояние
e.innerText=(new Date()).getHours()+':'+('0'+(new Date()).getMinutes()).slice(-2) + ':' + ('0'+(new Date()).getSeconds()).slice(-2);
healthCell[i].innerText='Работает'; statusCell[i].innerText='Ожидание'; statusCell[i].style.backgroundColor="yellow";
// проверки на готовность(их будет много)
//фактически на них весь код и построен
if((takeCell[i].innerText.match(/\d{2}/g).map(e=>parseInt(e)))[0] && (takeCell[i].innerText.match(/\d{2}/g).map(e=>parseInt(e)))[1] && (((takeCell[i].innerText.match(/\d{2}/g).map(e=>parseInt(e)))[1]<30 && (new Date()).getHours()==(takeCell[i].innerText.match(/\d{2}/g).map(e=>parseInt(e)))[0] && (new Date()).getMinutes()>=(takeCell[i].innerText.match(/\d{2}/g).map(e=>parseInt(e)))[1] && (new Date()).getMinutes()<=59) || ((takeCell[i].innerText.match(/\d{2}/g).map(e=>parseInt(e)))[1]>=30 && (new Date()).getHours()==(takeCell[i].innerText.match(/\d{2}/g).map(e=>parseInt(e)))[0]+1 && (new Date()).getMinutes()>=0 && (new Date()).getMinutes()<(takeCell[i].innerText.match(/\d{2}/g).map(e=>parseInt(e)))[1]-30)) || (takeCell[i].innerText.match(/\d{2}/g).map(e=>parseInt(e)))[2] && (takeCell[i].innerText.match(/\d{2}/g).map(e=>parseInt(e)))[3] && (((takeCell[i].innerText.match(/\d{2}/g).map(e=>parseInt(e)))[3]<30 && (new Date()).getHours()==(takeCell[i].innerText.match(/\d{2}/g).map(e=>parseInt(e)))[2] && (new Date()).getMinutes()>=(takeCell[i].innerText.match(/\d{2}/g).map(e=>parseInt(e)))[3] && (new Date()).getMinutes()<=59) || ((takeCell[i].innerText.match(/\d{2}/g).map(e=>parseInt(e)))[3]>=30 && (new Date()).getHours()==(takeCell[i].innerText.match(/\d{2}/g).map(e=>parseInt(e)))[2]+1 && (new Date()).getMinutes()>=0 && (new Date()).getMinutes()<(takeCell[i].innerText.match(/\d{2}/g).map(e=>parseInt(e)))[3]-30)) || (takeCell[i].innerText.match(/\d{2}/g).map(e=>parseInt(e)))[4] && (takeCell[i].innerText.match(/\d{2}/g).map(e=>parseInt(e)))[5] && (((takeCell[i].innerText.match(/\d{2}/g).map(e=>parseInt(e)))[5]<30 && (new Date()).getHours()==(takeCell[i].innerText.match(/\d{2}/g).map(e=>parseInt(e)))[4] && (new Date()).getMinutes()>=(takeCell[i].innerText.match(/\d{2}/g).map(e=>parseInt(e)))[5] && (new Date()).getMinutes()<=59) || ((takeCell[i].innerText.match(/\d{2}/g).map(e=>parseInt(e)))[5]>=30 && (new Date()).getHours()==(takeCell[i].innerText.match(/\d{2}/g).map(e=>parseInt(e)))[4]+1 && (new Date()).getMinutes()>=0 && (new Date()).getMinutes()<(takeCell[i].innerText.match(/\d{2}/g).map(e=>parseInt(e)))[5]-30)) || (takeCell[i].innerText.match(/\d{2}/g).map(e=>parseInt(e)))[6] && (takeCell[i].innerText.match(/\d{2}/g).map(e=>parseInt(e)))[7] && (((takeCell[i].innerText.match(/\d{2}/g).map(e=>parseInt(e)))[7]<30 && (new Date()).getHours()==(takeCell[i].innerText.match(/\d{2}/g).map(e=>parseInt(e)))[6] && (new Date()).getMinutes()>=(takeCell[i].innerText.match(/\d{2}/g).map(e=>parseInt(e)))[7] && (new Date()).getMinutes()<=59) || ((takeCell[i].innerText.match(/\d{2}/g).map(e=>parseInt(e)))[7]>=30 && (new Date()).getHours()==(takeCell[i].innerText.match(/\d{2}/g).map(e=>parseInt(e)))[6]+1 && (new Date()).getMinutes()>=0 && (new Date()).getMinutes()<(takeCell[i].innerText.match(/\d{2}/g).map(e=>parseInt(e)))[7]-30)) || (takeCell[i].innerText.match(/\d{2}/g).map(e=>parseInt(e)))[8] && (takeCell[i].innerText.match(/\d{2}/g).map(e=>parseInt(e)))[9] && (((takeCell[i].innerText.match(/\d{2}/g).map(e=>parseInt(e)))[9]<30 && (new Date()).getHours()==(takeCell[i].innerText.match(/\d{2}/g).map(e=>parseInt(e)))[8] && (new Date()).getMinutes()>=(takeCell[i].innerText.match(/\d{2}/g).map(e=>parseInt(e)))[9] && (new Date()).getMinutes()<=59) || ((takeCell[i].innerText.match(/\d{2}/g).map(e=>parseInt(e)))[9]>=30 && (new Date()).getHours()==(takeCell[i].innerText.match(/\d{2}/g).map(e=>parseInt(e)))[8]+1 && (new Date()).getMinutes()>=0 && (new Date()).getMinutes()<(takeCell[i].innerText.match(/\d{2}/g).map(e=>parseInt(e)))[9]-30)))
{
statusCell[i].innerText='Открыто'; statusCell[i].style.backgroundColor="green";
}
} else timeCell[i].innerText=statusCell[i].innerText=takeCell[i].innerText="---";
});
timerId=setTimeout(t,1000);
})();
window.onbeforeunload=()=>{clearTimeout(timerId)}