Почему не идёт проверка и получаются отрицательные значения?

Есть вот такая часть кода. startTime и stopTime - массивы с часом, минутой, секундой и милисекундой, которые прописаны намного выше.

let h, min, s, ms;
    h = stopTime[0]-startTime[0];
    min = stopTime[1]-startTime[1];
    s = stopTime[2]-startTime[2];
    ms = stopTime[3]-startTime[3];
    console.log([h,min,s,ms]);
    if (ms<0){
        --s;
        ms = ms + 1000;
        if (s<0){
            --min;
            s = s + 60;
            if (min<0){
            --h;
            min = min + 60;
            }
        }
    }

Данная часть кода должна отнимать соответствующие единицы времени первого массива из массива второго и если есть отрицительные значения, то приводить всё к положительным.

К сожалению, иногда получается такое:

введите сюда описание изображения

Не могу понять где ошибка. Помогите, пожалуйста, её отыскать.


Ответы (2 шт):

Автор решения: Aliaksandr Plekhau

Программа будет проверять секунды только если милисекунды получились отрицательными. Надо так:

if (ms<0) {
    --s;
    ms = ms + 1000;
}
if (s<0) {
    --min;
    s = s + 60;
}
if (min<0) {
    --h;
    min = min + 60;
}
→ Ссылка
Автор решения: vp_arth

Что-то вы всё переусложнили.
Содержать время в массиве слишком муторно, лучше вычислять компоненты по необходимости.
См. функцию timeToStr:

let h;
function timeToStr(time) {
  const ms = time % 1000;
  time = time / 1000 |0;
  const s = time % 60;
  time = time / 60 |0;
  const min = time % 60;
  time = time / 60 |0;
  const hours = time % 24;
  const days = time / 24 |0;
  let parts = [];
  if (days) parts.push(`${days} d `);
  if (hours || days) parts.push(`${hours}:`);
  parts.push(`${(min+'').padStart(2, '0')}:${(s+'').padStart(2, '0')}:${(ms+'').padStart(3, '0')}`)
  
  return parts.join('');  
}
const timer = document.querySelector('#timer');
const mul = document.querySelector('[name=multiplier]');
let startTime, duration;
function start() {
  startTime = Date.now();
  let m = mul.value || 1;
  mul.style.display = 'none';
  if (h) clearInterval(h);
  h = setInterval(() => {
    timer.innerText = timeToStr((Date.now()-startTime)*m);
  }, 50)
}
function stop() {
  duration = Date.now()-startTime;
  clearInterval(h);
  h = null;
  mul.style.display = '';
}
<span id="timer">0:00.000</span><hr/>

<button onclick="start()">Start</button>
<button onclick="stop()">Stop</button><br/>

<input name="multiplier" value="1" type="number" title="Ускоритель времени">

→ Ссылка