Использование объекта Date здесь возможно необязательно, по арифметике по модулю должно быть достаточно.
const pad = n => {
const s = String(n);
return s.length > 1 ? s : '0' + s;
};
const addHours = (timeVal, numHours) => {
const [hr, min, sec] = timeVal.split(':').map(Number);
const [,lefty, righty] = String(numHours).match(/(\d+)(?:(\.\d+))?/).map(Number);
const hours = (hr + lefty) % 24;
const minutes = righty === undefined ?
min :
((righty * 60 | 0) + min) % 60;
return [hours, minutes, sec].map(pad).join(':');
};
addHours('23:59:59', 2.5) // "01:29:59"
Обратите внимание, что, поскольку даты не используются, он не будет точно обрабатывать, например, переход на летнее время.Также обратите внимание, что в этом примере минуты округлены в меньшую сторону, при желании вы можете повторить логику для секунд.
Обратите внимание, что ваш подход с использованием объектов Date даст разных ответов для одних и тех же входных данных в зависимости откогда / где работает логика, по тем же причинам.