網頁顯示「即時時間」有兩種架構:
new Date() 取本地時間,setInterval 更新。缺點:受客戶端時鐘誤差、時區設定影響。<?php
header('Content-Type: text/html; charset=utf-8');
date_default_timezone_set('Asia/Taipei'); // 設定伺服器時區
// 輸出基準時間變數給 JS
$now = new DateTime();
?>
伺服器即時時間
長時間開啟頁面會有 JS 計時誤差(約幾秒/天),建議每 5-10 分鐘請求一次伺服器校準:
async function syncTime() {
try {
const res = await fetch('/api/time'); // 回傳 {timestamp: 1700000000}
const serverTime = new Date(res.timestamp * 1000);
// 更新 baseTime 變數...
} catch (e) { console.warn('時間同步失敗', e); }
}
setInterval(syncTime, 5 * 60 * 1000);
<?php
// /api/time.php
header('Content-Type: application/json');
echo json_encode(['timestamp' => time(), 'timezone' => 'Asia/Taipei']);
?>
<ServerClock /> 元件,內部用 ref/useState 管理狀態。| 項目 | 建議做法 |
|---|---|
| 時區 | PHP date_default_timezone_set 統一設定,資料庫儲存 UTC |
| 基準時間傳遞 | 內嵌 JS 變數或 API 取得,避免 inline script CSP 問題 |
| 日期進位 | JS 手寫或用 new Date(ts + 1000) 讓瀏覽器自動處理 |
| 長時誤差 | 定期 AJAX 校準或 WebSocket 推送 |
| 無障礙 | aria-live="polite" 讓螢幕閱讀器播報時間變化 |
採用「伺服器基準 + 前端遞增 + 定期校準」架構,即可實現精準、一致的即時時間顯示。