⏱️ 在線計時器附帶分段計時功能
按下開始後,這個工具並不是真的以三十毫秒為單位累加小塊的時間。它會在你按下開始的瞬間記錄 performance.now() 的精確讀數,然後每次重新繪製時,會從目前的讀數中減去這個儲存的數字,以得到經過的時間——這個數字是每次重新計算的,而不是累加的。這個區別很重要,因為瀏覽器會在背景標籤中故意減緩 setInterval 的速度以節省電池,這也是自製計時器會偏移或失去秒數的經典原因。因為這個計時器總是根據時間戳的差異來計算數字,而不是計算實際觸發了多少次間隔,所以當你回到標籤時,即使離開了幾分鐘,顯示的時間也會立即回復到正確的數值。
Stopwatch 是一個免費的瀏覽器計時器,它透過比較 monotonic performance.now() 時鐘與儲存的開始時間戳來追蹤經過的時間,而不是計算 setInterval 的觸發次數,因此即使瀏覽器減緩了標籤的螢幕更新,顯示的數字仍然準確。
隱私優先設計. 此工具完全在您的瀏覽器中運行 — 您輸入的內容不會上傳或儲存,而且它可以在離線狀態下使用。
關於
在底層有三個狀態:一個累計的 `elapsed` 值(以毫秒為單位),一個 `startAt` 的快照,即按下開始時的 `performance.now()` 讀數,以及一個布林值 `running`。產生螢幕上數字的函數只是 `elapsed` 加上,如果正在運行,則加上目前時間與 `startAt` 的差值。`setInterval` 每 30 毫秒呼叫一次這個函數,僅僅是為了重新繪製顯示——這個間隔本身不包含任何時間資訊,只是刷新觸發器。這是正確的計時器構建方式,直接避免了常見的錯誤,即計時器在每次觸發時都增加固定增量,一旦觸發被延遲、跳過或合併,就會逐漸偏移。
這個設計選擇也適用於切換到其他標籤時的情況。瀏覽器會減緩背景標籤的計時器以節省 CPU 和電池——設定為每 30 毫秒觸發一次的 `setInterval` 可能在標籤不可見時被延遲到每秒一次或更慢。在這個計時器中,這只會影響螢幕上數字重新繪製的頻率;底層的計算(目前時間戳減去開始時間戳,加上已經累計的時間)並不關心有多少次重新繪製被跳過。切換回標籤後,下一次重新繪製會立即顯示正確的經過時間——減速不會導致時間損失或增加,只會影響你在看其他東西時秒數顯示的流暢度。
使用 `performance.now()` 而不是 `Date.now()` 也是完成此任務的正確選擇,而不是偶然的細節。`Date.now()` 反映的是系統的牆鐘時間,而牆鐘時間可能會跳躍——例如筆記型電腦從睡眠中醒來並與 NTP 伺服器同步,手動更改時鐘,或調整夏令時,都可能導致 `Date.now()` 在會話中向前或甚至向後跳躍。`performance.now()` 被定義為單調時鐘:它只以穩定的速度增加,不受這些修正的影響,這正是計時器所需的保證,而普通的牆鐘計時器則沒有這種特性。
誠實的限制是持久性,而這裡並沒有。這個版本將 `elapsed` 和 `laps` 陣列保存為頁面記憶體中的普通 JavaScript 變數——源碼中沒有任何地方呼叫 localStorage 或這個網站自己的 `Playground.store()` 助手函數,其他 Toolio 工具使用它來在重新載入後生存。這意味著刷新頁面、關閉標籤或點選到其他工具會立即且永久地刪除你的運行時間和所有記錄的計時。沒有 "恢復上次會話" 的功能,沒有跨設備同步,也沒有任何備份,因為從一開始就沒有任何東西被寫入存儲。如果你的計時歷史實際上很重要——例如健身日誌或演示時間——在導航離開前請手動複製數字或截圖,因為這個頁面不會為你記住它們。
如何使用
- 點選 "開始"——按鈕立即重新標籤為 "暫停",螢幕上的計時器開始以實際時間增加,每 30 毫秒重新繪製一次。
- 在運行時點選 "計時",可以快照當前的經過時間;新的條目會被固定在計時列表的頂部,並顯示其分段(自上一個計時以來的時間)和總計。
- 再次點選同一個按鈕,現在標籤為 "暫停",以凍結顯示——經過的時間在內部被保留,沒有任何損失,按鈕會恢復為 "開始"。
- 再次點選 "開始" 以從你離開的地方繼續計時,而不是從零開始。
- 點選 "重置" 以將顯示歸零,清除所有記錄的計時,並恢復兩個按鈕到初始標籤——這也是開始新會話的唯一方式,因為沒有保存功能來保護舊會話。
常見問題
- 這個計時器實際上是如何在底層測量時間的?
- 它會在你按下開始的瞬間讀取一次 `performance.now()`,並儲存這個數字。從那以後,螢幕上的數字只是 "已經累計的時間" 加上 "目前的 `performance.now()` 減去那個儲存的開始時間戳"——在每次 30 毫秒的重新繪製時重新計算。它從來不會在每個觸發時簡單地將固定的 +30 毫秒加到運行總數上,這就是導致許多自製計時器逐漸偏離同步的捷徑。
- 如果我在它運行時切換到另一個瀏覽器標籤,時間會發生什麼變化?
- 背景標籤會被減速——瀏覽器可以將 30 毫秒的 `setInterval` 延遲到每秒一次或更慢,以節省 CPU 和電池,因此螢幕上的數字可能在你離開時看起來凍結或跳躍。但因為這個計時器總是根據時間戳差異來計算經過時間,而不是計算觸發了多少次,所以切換回標籤後,下一次重新繪製會立即顯示正確的經過時間。你不會因為減速而損失或增加時間——只有在你看不到時視覺的流暢度會受到影響。
- 為什麼使用 `performance.now()` 而不是 `Date.now()`——這真的有影響嗎?
- 是的。`Date.now()` 反映的是系統的牆鐘時間,這可能會向前或向後跳躍——例如筆記型電腦從睡眠中醒來並與 NTP 伺服器同步,或如果系統時鐘被手動更改。`performance.now()` 是一個單調時鐘,只會以穩定的速度增加,並不受這些修正的影響,這正是計時器所需的特性,而這個版本使用了正確的選擇。
- 它會將我的經過時間或計時歷史儲存在任何地方嗎?
- 不會——與其他一些 Toolio 工具不同,它完全不使用瀏覽器的 localStorage 來儲存這些資料。你看到的一切只存在於這個特定標籤的記憶體中,只要這個標籤保持打開。刷新頁面、關閉標籤或導航到其他工具,你的經過時間和所有計時都會永久消失;沒有恢復功能,也沒有自動保存,因為從一開始就沒有任何東西被寫入存儲。如果你需要記錄,請在離開前手動複製數字或截圖。
- 計時有沒有數量限制?每個計時行上的兩個數字代表什麼?
- 沒有數量限制——列表會不斷增長,最新計時會固定在頂部。每一行顯示兩個數字:分段時間,以強調顏色顯示,是自上一個計時以來經過的時間;總計時間,以灰色顯示,是自按下開始以來的累計時間。這種組合讓你可以評估單個片段——例如一次健身間隔或一次演講部分——而不會失去整體運行的追蹤。
- 此工具會上傳我的資料嗎?
- 不會。所有運作都在您的瀏覽器中進行,因此您的資料永遠不會離開您的設備 — 頁面載入後,它甚至可以在離線狀態下使用。