Javascript даты по своей сути являются UT C, однако различные не-UT C get и set все работают с локальными датами и временем на основе хоста системные часы и настройки летнего времени.
Так что, если вы не используете методы UT C, все в OP по умолчанию является "локальным". Ниже приведена упрощенная c реализация вашего «времени до следующей пятницы в 15:00» в виде локальных значений:
function timeUntil() {
let now = new Date();
// Create date for 15:00 on coming Friday
let friday = new Date(now);
friday.setHours(15,0,0,0);
let dayNum = friday.getDay();
friday.setDate(friday.getDate() + 5 - (dayNum < 6? dayNum : 5 - dayNum));
// If today is Friday and after 15:00, set to next Friday
if (dayNum == 5 && friday < now) {
friday.setDate(friday.getDate() + 7);
}
// Time remaining
let diff = friday - now;
let days = diff / 8.64e7 |0;
let hrs = (diff % 8.64e7) / 3.6e6 | 0;
let mins = (diff % 3.6e6) / 6e4 | 0;
let secs = (diff % 6e4) / 1e3 | 0;
// Display result
document.getElementById('days').textContent = days;
document.getElementById('hrs').textContent = hrs;
document.getElementById('mins').textContent = mins;
document.getElementById('secs').textContent = secs;
document.getElementById('fullDate').textContent = friday.toLocaleString();
}
setInterval(timeUntil, 1000);
td {
text-align: center;
}
<table>
<tr><th>Days<th>Hrs<th>Mins<th>Secs
<tr><td id="days"><td id="hrs"><td id="mins"><td id="secs">
<tr><td id="fullDate" colspan="4">
</table>
Обратите внимание, что setInterval не является хорошим способом запуска таймера в течение длительного периода времени, поскольку он дрейфует (это не не выполняется на точно указанный интервал). Общее время будет в норме, время от времени будет казаться пропущенным и смещаться в течение секунды относительно отображаемых в системе часов.
Лучше использовать последовательные вызовы setTimeout , вычисляя время до следующей полной секунды каждый раз, так что оно близко соответствует тику системных часов.