diff --git a/edc-web/app/static/js/test_data.js b/edc-web/app/static/js/test_data.js index 2916e2a..facc6d5 100644 --- a/edc-web/app/static/js/test_data.js +++ b/edc-web/app/static/js/test_data.js @@ -81,7 +81,10 @@ function toSpeed(v) { function fmtTime(v) { if (!v) return '-'; - const d = new Date(v); + // Flask jsonify 给 MySQL DATETIME 加 "GMT" 后缀,但实际值是服务器本地时间(UTC+8) + // 去掉 "GMT" 让 JS 按本地时间解析,避免时区偏移 8 小时 + const cleaned = String(v).replace(/ GMT$/, ''); + const d = new Date(cleaned); if (isNaN(d.getTime())) return String(v).substring(0, 19); const y = d.getFullYear(); const m = String(d.getMonth() + 1).padStart(2, '0'); diff --git a/edc-web/app/static/js/test_op.js b/edc-web/app/static/js/test_op.js index 7b52d6c..bd52a56 100644 --- a/edc-web/app/static/js/test_op.js +++ b/edc-web/app/static/js/test_op.js @@ -200,6 +200,12 @@ async function pollProgress() { const data = await resp.json(); const stats = data.stats; + // ── 先渲染数据(放在所有 return 之前,避免完成时跳过渲染)── + try { if (data.latest) renderLatest(data.latest); } catch (e) { console.error("renderLatest:", e); } + try { if (data.averages) renderAverages(data.averages); } catch (e) { console.error("renderAverages:", e); } + try { if (data.latest_wave) renderLatestWave(data.latest_wave); } catch (e) { console.error("renderLatestWave:", e); } + try { if (data.records && data.records.length) renderRecords(data.records); } catch (e) { console.error("renderRecords:", e); } + // 更新计数 const newDone = stats.done || 0; const newFailed = stats.failed || 0; @@ -244,12 +250,6 @@ async function pollProgress() { } } - // 显示最新结果(独立 try-catch,避免一处报错影响全部) - try { if (data.latest) renderLatest(data.latest); } catch (e) { console.error("renderLatest:", e); } - try { if (data.averages) renderAverages(data.averages); } catch (e) { console.error("renderAverages:", e); } - try { if (data.latest_wave) renderLatestWave(data.latest_wave); } catch (e) { console.error("renderLatestWave:", e); } - try { if (data.records && data.records.length) renderRecords(data.records); } catch (e) { console.error("renderRecords:", e); } - } catch (e) { console.error("轮询失败:", e); } @@ -293,7 +293,10 @@ function toSpeed(v) { function fmtTime(v) { if (!v) return '-'; - const d = new Date(v); + // Flask jsonify 给 MySQL DATETIME 加 "GMT" 后缀,但实际值是服务器本地时间(UTC+8) + // 去掉 "GMT" 让 JS 按本地时间解析,避免时区偏移 8 小时 + const cleaned = String(v).replace(/ GMT$/, ''); + const d = new Date(cleaned); if (isNaN(d.getTime())) return String(v).substring(0, 19); const y = d.getFullYear(); const m = String(d.getMonth() + 1).padStart(2, '0');