線上秒錶

精確的線上秒錶,支援計圈、分段時間、鍵盤快捷鍵和一鍵複製成績列表。使用單調時鐘,後臺標籤頁被節流也不會走偏。

不會走偏的秒錶。 用按鈕或鍵盤開始、暫停和計圈。每一圈同時記錄本圈用時和累計總時,整份列表可以一次性複製出去。

00:00:00.00

空格開始 / 暫停,L 計圈,R 重置。

圈次
# 本圈 累計

還沒有記錄任何圈次。

瀏覽器秒錶怎樣才算準確

用時間戳,而不是用累加計數

做秒錶最直覺的方式是每次定時器觸發就往計數器上加一個固定值。這也是錯誤的方式,因為瀏覽器裡的定時器並不保證按時觸發。切到別的標籤頁,間隔會被節流到每秒一次甚至完全暫停;合上筆記本,它就徹底停了。用這種方式做出來的計數器會丟時間,而且丟了就再也補不回來。

本秒錶的做法是記錄開始的那一刻,然後在每次重繪時用當前時刻減去它。沒有任何東西在累加,因此也就沒有任何誤差可以累積。標籤頁被節流時顯示會停止重新整理,但底層時鐘照常前進,你切回來後的第一幀顯示的就是正確的已用時間,而不是一個在你離開期間落後了的數字。

用單調時鐘,不用牆上時鐘

這裡使用的是 performance.now(),它從頁面載入開始計數,並且只會向前走。這一點很重要,因為牆上時鐘——也就是 Date.now() 報告的時間——是會跳變的。NTP 校正會微調它,夏令時切換會移動它,使用者改一下系統時間就能讓它在任意方向上跳幾個小時。

從牆上時鐘讀數的秒錶會完整繼承這些跳變。如果一次 NTP 同步恰好發生在測量過程中,你記錄的間隔就是錯的,而介面上不會有任何跡象提示你。單調時鐘沒有這種失效模式:它不與任何東西同步,無法被調整,它唯一測量的就是流逝的時間。

本圈與累計:為什麼兩個都要顯示

每一行記錄兩個數字。累計是從開始到該圈的時間,本圈是距上一圈的時間。它們回答的是不同的問題,搞清楚自己在看哪一個很有必要。

給跑者計八圈時,本圈時間告訴你他是在保持配速、掉速還是在衝刺——這是每一圈的表現。累計時間告訴你他相對於全程目標成績處在什麼位置。只看累計時很難發現掉速,因為每個數字都包含了它之前的全部時間;只看本圈又會丟掉整體結果。兩個都顯示,你就能在同一張表裡同時讀出配速和進度,匯出的內容也保留了這兩列,方便貼上到任何地方。

全部在瀏覽器本地用原生 JavaScript 執行,不依賴第三方庫,不上傳資料,不做追蹤。

常見問題

計時精度有多高?
顯示精確到百分之一秒,底層時鐘精度在毫秒以下。實際瓶頸是你按按鈕的反應時間,而不是計時器本身。
切換標籤頁後還會繼續走嗎?
會。因為瀏覽器會節流後臺標籤頁,畫面重新整理會暫停,但已用時間是根據時間戳算出來的,所以切回來時顯示的立刻就是正確值。
本圈和累計有什麼區別?
累計是從開始到該圈的總時間,本圈是距離上一圈的時間。本圈反映配速,累計反映相對於全程的進度。
重新整理頁面後圈次會保留嗎?
不會。所有資料只存在記憶體中,重新整理即清空。如果需要保留,請在離開頁面前先複製圈次列表。
有哪些鍵盤快捷鍵?
空格開始 / 暫停,L 計圈,R 重置。在輸入框內打字時這些快捷鍵會被忽略,不會誤觸發。
暫停狀態下能計圈嗎?
不能,按鈕此時是停用的。計圈標記的是一次進行中的測量裡的某個時刻,時鐘停著的時候記一圈只會重複當前的累計值。