Ваша проблема:
- PHP предоставляет по запросу страницы соответствующие значения даты.
- Вы сохраняете эти значения в JS
- Вы повторяете все те же значения.Следовательно, цикл работает, но значения остаются неизменными.
Вместо того, что вы должны:
- Создать
var D = new Date("<?php echo date('D M d Y H:i:s O');?>");
вне вашей функции . - При каждом тайм-ауте добавляйте одну секунду к вашей начальной дате PHP
DATE = PHP:initial + JS:now - JS:initial
function zero(n) { return n > 9 ? n : "0" + n; }
var months = [
"января", "февраля", "марта", "апреля", "мая", "июня",
"июля", "августа", "сентября", "октября", "ноября", "декабря",
];
var jsDate = new Date(); // Store JS time
// I'll hardcode a date string for demo purpose:
var phpDate = new Date("Sun Sep 09 2018 23:59:55 +0000");
// You, use this instead:
// var phpDate = new Date("<?php echo date('D M d Y H:i:s O');?>");
function clock() {
var diff = +new Date() - +jsDate; // Get seconds difference
var date = new Date(+phpDate + diff); // Add difference to initial PHP time
var y = date.getFullYear(),
M = date.getMonth(),
d = zero(date.getDate()),
h = zero(date.getHours()),
m = zero(date.getMinutes()),
s = zero(date.getSeconds());
document.getElementById("doc_time").innerHTML = `
Дата: ${d} ${months[M]} ${y}.  
Время: ${h}:${m}:${s}
`;
setTimeout(clock, 1000);
}
clock();
<div id="doc_time"></div>