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