Иметь ввиду, что функции setTimeout и setInterval не гарантируют, что функция будет выполнена через заданное число милисекунд, они лишь гарантируют, что функция будет выполнена не раньше, а там - как повезёт. Потому для таймера лучше всего запоминать в отдельной переменной время начала (или время окончания, если у нас обратный отсчёт до нуля), и вычитать его из текущего времени (или наоборот) при отображении. А для обновления отображаемого значения как раз и использовать setInterval, но иметь ввиду, что промежутки могут быть неровными.