Можно всё считать в локальной временной зоне. Известно смещение от UTC времени магазина. Текущее смещение посетителя от UTC получаем через
getTimezoneOffset().
Задача получить два объекта времени: открытия и закрытия магазина, во временной зоне браузера посетителя.
Если какой-то из двух оказался в прошлом, добавляем ему один день, чтобы оба оказались в будущем. Который из двух оказался меньше – подскажет, открыт сейчас магазин или закрыт.
Решениеfunction tillItOpens() {
const D = new Date();
const shopOffsetMin = 5 * 60; // GMT+5
const myOffsetMin = D.getTimezoneOffset();
const diffMin = shopOffsetMin + myOffsetMin;
function futureDate(hours, fixMin) {
const d = new Date();
d.setHours(hours);
d.setMinutes(0 + fixMin);
d.setSeconds(0, 0);
if (d < new Date()) d.setDate(d.getDate() + 1);
return d;
}
const dOpens = futureDate(9, diffMin);
const dCloses = futureDate(21, diffMin);
if (dOpens < dCloses) {
// скоро откроется
const hours = Math.floor((dOpens - D) / 36e5);
const minutes = Math.floor((dOpens - D) / 6e4) - 60 * hours;
return `до открытия ${hours}:${minutes}`
} else {
// сейчас открыто
return "Сейчас открыто!";
// хорошо ещё посмотреть, сколько остаётся до закрытия - успеет ли чел.
// ближайшее закрытие – объект dCloses
}
}
Если сейчас закрыт, запускайте таймер обратного отсчёта до объекта
dOpens
– он означает время открытия в текущей таймзоне.