線上碼錶
免費線上碼錶,支援毫秒級精度和分段計時
什麼是線上碼錶?
線上碼錶是一種從零開始向上計時的精密計時工具,通常支援毫秒級精度。它和倒數計時器不同:碼錶回答的是「這件事花了多久?」,非常適合運動訓練、實驗記錄、演講排練、烹飪計時、集中開發等需要追蹤耗時的情境。本工具完全在瀏覽器中執行,使用 requestAnimationFrame 實現流暢顯示更新,使用 performance.now() 進行單調時間測量,即使系統時間被調整也能保持精確。計次功能可以記錄分段成績並標示最快/最慢圈,所有資料僅保存在本機,不會上傳。
使用方式
快速上手
- 點選「開始」啟動計時,顯示格式為 時:分:秒.毫秒
- 計時過程中點選「計次」記錄分段成績,碼錶不會停止
- 點選「暫停」凍結顯示,再點「開始」繼續計時
- 點選「重置」清除計時器和所有計次記錄
使用技巧
- 碼錶使用 requestAnimationFrame 實現約 16ms 的顯示更新頻率,使用 performance.now() 保證精確計時。
- 保持分頁可見可獲得最流暢的顯示。背景分頁可能會限制動畫幀更新。
- 計次成績用顏色區分:綠色為最快圈,紅色為最慢圈。
使用場景
技術原理
碼錶引擎完全避免了容易漂移的 setInterval 模式。它使用 requestAnimationFrame(rAF)驅動顯示更新,以 performance.now() 作為基準時間源。使用者點選「開始」時,引擎記錄當前 performance.now() 時間戳作為 startTime。在每一幀動畫中,計算 elapsed = accumulated + (performance.now() - startTime),其中 accumulated 儲存了最近一次暫停前的累計時間。這種雙變數模型(累計時間 + 執行時增量)能夠正確處理暫停/恢復循環,不會丟失次毫秒級精度。 選擇 performance.now() 而非 Date.now() 是因為它是單調遞增的——不會因 NTP 校正、手動調整時鐘或日光節約時間切換而跳變。它還能提供次毫秒級解析度(現代瀏覽器中通常為 5 微秒粒度),使其成為短時間、高精度計時的正確選擇。rAF 回呼被限制在顯示器更新率(通常 60 Hz ≈ 16.67 ms,高更新率螢幕可達 120 Hz),因此視覺更新流暢但並非時間基準——實際經過時間來自 performance.now() 計算,始終保持正確。 計次功能在點選「計次」按鈕時捕獲當前 elapsedMs,透過與前一圈的總時間相減計算分段差值。最快和最慢圈透過 Math.min/Math.max 比較所有圈差值得出,分別用綠色和紅色標示。所有狀態儲存在 React 的 useState 鉤子中,位於客戶端元件內,不進行持久化或傳輸——碼錶本身是暫時的,關閉頁面或點選「重置」按鈕後完全清除。
- performance.now() 提供單調遞增的次毫秒級時間戳,不受系統時鐘變化影響。
- requestAnimationFrame 以顯示器更新率(60–120 Hz)驅動顯示更新,呈現流暢。
- 累計時間 + 執行時增量模型處理暫停/恢復,不損失精度。
- 計次差值透過 currentTotal - previousTotal 計算,實現精確分段計時。
- 所有計算在瀏覽器本機完成,無伺服器通訊或資料上傳。
範例
田徑跑道 —— 400 公尺分圈
第 1 圈 -> 01:12.450 (+01:12.450)
第 2 圈 -> 02:26.180 (+01:13.730)
第 3 圈 -> 03:38.910 (+01:12.730)
第 4 圈 -> 04:50.320 (+01:11.410 最快)演講排練 —— 逐頁計時
開場 -> 00:45.200 (+00:45.200)
問題 -> 02:10.850 (+01:25.650)
方案 -> 04:35.120 (+02:24.270)
展示 -> 07:10.430 (+02:35.310)
總結 -> 08:25.610 (+01:15.180)
總計:8 分 25 秒 —— 未超過 10 分鐘目標HIIT 訓練 —— 間歇追蹤
第 1 組 -> 00:30.150 (+00:30.150)
休息 1 -> 00:45.320 (+00:15.170)
第 2 組 -> 01:15.480 (+00:30.160)
休息 2 -> 01:30.510 (+00:15.030)
第 3 組 -> 02:00.670 (+00:30.160 最慢)
第 4 組 -> 02:30.520 (+00:29.850 最快)常見問題
碼錶的精度有多高?
碼錶使用 performance.now(),提供次毫秒級精度(現代瀏覽器中通常為 5 微秒粒度)。顯示透過 requestAnimationFrame 以約每秒 60 幀更新,視覺更新與真實值偏差在 16 ms 以內。對大多數實用場景——運動、烹飪、演講——這完全足夠。
切換分頁後碼錶還會繼續計時嗎?
會的。經過時間是基於絕對的 performance.now() 時間戳計算的,而非累計計數。切換回分頁時,顯示會立刻呈現正確的經過時間。但 requestAnimationFrame 在背景分頁中會被限制,因此視覺更新可能暫停,直到你返回分頁。
電腦進入睡眠會怎樣?
performance.now() 是單調遞增的,但在系統暫停期間不會推進。電腦喚醒後,碼錶顯示的時間將不包含睡眠期間的時長——對大多數計時情境,這是正確的行為。
可以匯出或儲存計次記錄嗎?
碼錶目前不支援儲存或匯出計次資料。所有計次記錄儲存在記憶體中,重置計時器或關閉頁面後會被清除。如需持久記錄,請考慮手動複製顯示的時間,或使用專用的運動追蹤裝置。
為什麼使用 performance.now() 而不是 Date.now()?
performance.now() 是單調遞增的——永遠不會倒退。Date.now() 在系統時鐘被調整時(NTP 同步、手動修改、日光節約時間切換)可能會跳躍數秒甚至數分鐘。對短時間計時,performance.now() 是正確的選擇。它還能提供次毫秒級解析度,而 Date.now() 只有毫秒級。
有任何資料會上傳到伺服器嗎?
不會。碼錶完全在瀏覽器中執行。計時資料、計次記錄或使用資訊不會傳送到任何伺服器。頁面載入後即可離線使用。
碼錶和倒數計時器有什麼區別?
碼錶從零開始向上計時,回答「花了多久時間?」。倒數計時器從設定時長開始遞減到零,回答「還剩多久時間?」。本工具是碼錶;如需倒數計時功能,請使用倒數計時器工具。