При загрузке страницы передаете время сервера.
На клиенте берете текущее время, вычисляете насколько оно отличается от серверного.
Затем по setInterval() раз в секунду берете время клиента, применяете к нему поправку, и обновляете циферки на дисплее.
Делать сам отсчет на setInterval(..., 1000) - идея так себе, потому что он вообще не гарантирует, что следующий вызов функции будет через секунду. Он гарантирует, что вызов будет НЕ РАНЬШЕ ЧЕМ через секунду. Ну и есть еще замедление работы при переключении вкладки, сворачивании окна, а так же уход компьютера в сон, гибернацию, вот это все.