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);