From 5d6e967794a85eb2f299dce718fc0ea60b491c46 Mon Sep 17 00:00:00 2001 From: yarnom Date: Tue, 23 Sep 2025 21:02:19 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E4=BF=AE=E6=AD=A3=E5=88=B0=E8=BE=BE?= =?UTF-8?q?=E6=97=B6=E9=97=B4=E7=AE=97=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- templates/radar_guangzhou.html | 9 ++++++++- templates/radar_nanning.html | 8 +++++++- 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/templates/radar_guangzhou.html b/templates/radar_guangzhou.html index baec20d..47cb019 100644 --- a/templates/radar_guangzhou.html +++ b/templates/radar_guangzhou.html @@ -104,6 +104,8 @@ let gWindFromDeg = null, gWindSpeedMS = null; let gTimes = []; let gCurrentIdx = -1; + // 当前渲染瓦片的时间(用于 ETA 基准时间) + let gTileDT = null; function toRad(d){ return d * Math.PI / 180; } function toDeg(r){ return r * 180 / Math.PI; } @@ -217,6 +219,8 @@ try{ const base = forcedDt ? new Date(forcedDt.replace(/-/g,'/')) : new Date(t.dt.replace(/-/g,'/')); + // 记录本次瓦片时间供 ETA 使用 + gTileDT = base; const ceil10=new Date(base); const m=base.getMinutes(); const up=(Math.floor(m/10)*10+10)%60; ceil10.setMinutes(up,0,0); if(up===0){ ceil10.setHours(base.getHours()+1); } const pad=(n)=>String(n).padStart(2,'0'); const dtStr=`${ceil10.getFullYear()}-${pad(ceil10.getMonth()+1)}-${pad(ceil10.getDate())} ${pad(ceil10.getHours())}:${pad(ceil10.getMinutes())}:00`; await loadRealtimeAt(dtStr); @@ -268,7 +272,10 @@ const statusEl=document.getElementById('sectorStatus'); const detailEl=document.getElementById('sectorDetail'); if(!best){ statusEl.textContent='无(≥40 dBZ)'; detailEl.classList.add('hidden'); } else { - const etaSec=best.dist/gWindSpeedMS; const eta=new Date(Date.now()+etaSec*1000); + const etaSec=best.dist/gWindSpeedMS; + // 使用雷达瓦片时间作为 ETA 基准 + const base = gTileDT instanceof Date ? gTileDT : new Date(); + const eta=new Date(base.getTime()+etaSec*1000); const pad=(n)=>String(n).padStart(2,'0'); const etaStr=`${eta.getFullYear()}-${pad(eta.getMonth()+1)}-${pad(eta.getDate())} ${pad(eta.getHours())}:${pad(eta.getMinutes())}`; document.getElementById('sectorDist').textContent=(best.dist/1000).toFixed(1); document.getElementById('sectorETA').textContent=etaStr; diff --git a/templates/radar_nanning.html b/templates/radar_nanning.html index 3c161bd..ad63338 100644 --- a/templates/radar_nanning.html +++ b/templates/radar_nanning.html @@ -103,6 +103,8 @@ let gWindFromDeg = null, gWindSpeedMS = null; let gTimes = []; let gCurrentIdx = -1; + // 当前渲染瓦片的时间(用于 ETA 基准时间) + let gTileDT = null; async function loadLatestTile() { const res = await fetch('/api/radar/latest?z=7&y=40&x=102'); @@ -286,6 +288,8 @@ try { const dt = forcedDt ? new Date(forcedDt.replace(/-/g,'/')) : new Date(t.dt.replace(/-/g,'/')); + // 记录本次瓦片的时间,供 ETA 计算使用 + gTileDT = dt; const ceil10 = new Date(dt); const m = dt.getMinutes(); const up = (Math.floor(m/10)*10 + 10) % 60; @@ -421,7 +425,9 @@ detailEl.classList.add('hidden'); }else{ const etaSec = best.dist / gWindSpeedMS; - const eta = new Date(Date.now() + etaSec*1000); + // 使用雷达瓦片时间作为 ETA 基准 + const base = gTileDT instanceof Date ? gTileDT : new Date(); + const eta = new Date(base.getTime() + etaSec*1000); const pad = (n)=> String(n).padStart(2,'0'); const etaStr = `${eta.getFullYear()}-${pad(eta.getMonth()+1)}-${pad(eta.getDate())} ${pad(eta.getHours())}:${pad(eta.getMinutes())}`; document.getElementById('sectorDist').textContent = (best.dist/1000).toFixed(1);