From 0dcaf486c0c011090b5f29cba8f17703089de1a4 Mon Sep 17 00:00:00 2001 From: ua1zbe Date: Mon, 28 Sep 2026 05:05:43 +0000 Subject: [PATCH] =?UTF-8?q?=D0=A7=D0=B0=D1=81=D0=BE=D0=B2=D0=BE=D0=B9=20?= =?UTF-8?q?=D0=BF=D0=BE=D1=8F=D1=81:=20=D0=B2=D1=80=D0=B5=D0=BC=D1=8F=20?= =?UTF-8?q?=D0=BF=D0=BE=20=D0=9C=D0=A1=D0=9A=20=D0=BD=D0=B5=D0=B7=D0=B0?= =?UTF-8?q?=D0=B2=D0=B8=D1=81=D0=B8=D0=BC=D0=BE=20=D0=BE=D1=82=20=D1=87?= =?UTF-8?q?=D0=B0=D1=81=D0=BE=D0=B2=D0=BE=D0=B3=D0=BE=20=D0=BF=D0=BE=D1=8F?= =?UTF-8?q?=D1=81=D0=B0=20=D1=83=D1=81=D1=82=D1=80=D0=BE=D0=B9=D1=81=D1=82?= =?UTF-8?q?=D0=B2=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Было: nowMs() прибавляла 3 часа к epoch, а getHours()/getDay() читали результат в местном поясе телефона. На устройстве в МСК приложение показывало время на 3 часа вперёд. Стало: Europe/Moscow через Intl.DateTimeFormat, с запасным вариантом UTC+3, если Intl недоступен. --- web/index.html | 39 +++++++++++++++++++++++++++++++++++---- 1 file changed, 35 insertions(+), 4 deletions(-) diff --git a/web/index.html b/web/index.html index 54f7eb3..ac28463 100644 --- a/web/index.html +++ b/web/index.html @@ -140,7 +140,38 @@ const DIRECTIONS = { const DAYS = ["воскресенье","понедельник","вторник","среда","четверг","пятница","суббота"]; function toMin(t){ const [h,m]=t.split(":").map(Number); return h*60+m; } -function nowMs(){ return new Date(Date.now()+3*3600*1000); } // МСК = UTC+3 + +// Текущее время по МСК, независимо от часового пояса устройства +const MSK_TZ = "Europe/Moscow"; +let mskFmt = null; +try { + mskFmt = new Intl.DateTimeFormat("en-US", { + timeZone: MSK_TZ, hourCycle: "h23", + year: "numeric", month: "2-digit", day: "2-digit", + hour: "2-digit", minute: "2-digit", second: "2-digit" + }); +} catch(e){ mskFmt = null; } + +function nowMs(){ + if (mskFmt) { + try { + const parts = {}; + mskFmt.formatToParts(new Date()).forEach(x => parts[x.type] = x.value); + const hour = Number(parts.hour) % 24; // на части движков полночь приходит как "24" + return { + hour: hour, + minute: Number(parts.minute), + second: Number(parts.second), + day: new Date(Date.UTC(Number(parts.year), Number(parts.month) - 1, + Number(parts.day))).getUTCDay() + }; + } catch(e){ /* ниже — запасной вариант */ } + } + // Запасной вариант: МСК = UTC+3 (переход на летнее время отменён) + const d = new Date(Date.now() + 3*3600*1000); + return { hour: d.getUTCHours(), minute: d.getUTCMinutes(), + second: d.getUTCSeconds(), day: d.getUTCDay() }; +} function fmtWait(m){ if(m <= 0) return "отправление сейчас"; @@ -154,7 +185,7 @@ let currentStop = "Полярные Зори"; function render(){ const now = nowMs(); - const curMin = now.getHours()*60 + now.getMinutes(); + const curMin = now.hour*60 + now.minute; const dirs = DIRECTIONS[currentStop]; document.getElementById("dirBox").innerHTML = dirs.map(d=>{ const upcoming = SCHEDULE @@ -185,14 +216,14 @@ function renderTable(){ } function renderDay(){ - const dow = nowMs().getDay(); + const dow = nowMs().day; document.getElementById("dayBadge").innerHTML = `Сегодня ${DAYS[dow]}`; } function tickClock(){ const d = nowMs(); const p = n=>String(n).padStart(2,"0"); - document.getElementById("clock").innerHTML = `${p(d.getHours())}:${p(d.getMinutes())}:${p(d.getSeconds())} МСК`; + document.getElementById("clock").innerHTML = `${p(d.hour)}:${p(d.minute)}:${p(d.second)} МСК`; } document.querySelectorAll(".pick").forEach(btn=>{