オンラインストップウォッチ
ミリ秒精度とラップタイム計測に対応した無料オンラインストップウォッチ
オンラインストップウォッチとは?
オンラインストップウォッチは、ゼロから経過時間を計測する精密タイミングツールで、通常ミリ秒単位の分解能を備えています。カウントダウンタイマーとは異なり、ストップウォッチは「それにどれくらい時間がかかったか?」を測定します。スポーツトレーニング、実験、プレゼンテーション、料理、コーディングスプリントなど、固定の終了点ではなく経過時間を追跡したいあらゆる活動に最適です。このツールはブラウザ内で完全に動作し、requestAnimationFrameによるスムーズな表示更新とperformance.now()による単調な時間計測を使用しているため、システム時刻が調整されても正確さを保ちます。ラップ記録機能でスプリットタイムを取得し、最速/最遅ラップをハイライト表示します。すべてのデータはローカルに保存され、アップロードされることはありません。
使い方
クイックスタート
- 「開始」をクリックして計測開始 — 時:分:秒.ミリ秒の形式で表示されます
- 計測中に「ラップ」をクリックしてスプリットタイムを記録(ストップウォッチは止まりません)
- 「一時停止」をクリックして表示を固定し、再度「開始」で再開
- 「リセット」をクリックしてタイマーとすべてのラップ記録をクリア
計測のヒント
- ストップウォッチはrequestAnimationFrameで約16ms間隔の表示更新、performance.now()で正確な経過時間を計測します。
- 最もスムーズな表示のためにタブを表示状態に保ってください。バックグラウンドタブではアニメーションフレームが制限される場合があります。
- ラップタイムは色分けされます:最速ラップは緑、最遅ラップは赤で表示されます。
ユースケース
技術原理
ストップウォッチエンジンは、ドリフトが発生しやすいsetIntervalパターンを完全に回避しています。代わりに、表示更新にはrequestAnimationFrame(rAF)、基準となる時間源としてperformance.now()を使用しています。ユーザーが「開始」をクリックすると、エンジンは現在のperformance.now()タイムスタンプをstartTimeとして記録します。各アニメーションフレームで、elapsed = accumulated + (performance.now() - startTime)を計算します。ここでaccumulatedは直近の一時停止前の累積経過時間を保持します。この2変数モデル(累積時間 + 実行時デルタ)により、サブミリ秒の精度を失うことなく一時停止/再開サイクルを正しく処理します。 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 で計算され、正確なスプリットタイミングを実現。
- すべての計算はブラウザ内でローカルに実行され、サーバーとの通信やデータアップロードはありません。
例
陸上トラック — 400mラップスプリット
ラップ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フレームで更新されるため、視覚的な更新は実際の値から16ms以内です。スポーツ、料理、プレゼンテーションなど、ほとんどの実用的な目的には十分以上です。
タブを切り替えてもストップウォッチは動き続けますか?
はい。経過時間は累積ティックではなく、絶対的なperformance.now()タイムスタンプから計算されます。タブに戻ると、ディスプレイはすぐに正しい経過時間を表示します。ただし、requestAnimationFrameはバックグラウンドタブでは制限されるため、戻るまで視覚的な更新が一時停止する場合があります。
コンピューターがスリープするとどうなりますか?
performance.now()は単調ですが、システムがサスペンドされている間は進行しません。コンピューターが復帰すると、ストップウォッチの表示はシステムがスリープしていなかったかのように経過時間を表示します — スリープ時間は含まれません。これはほとんどの計時ユースケースにとって正しい動作です。
ラップタイムをエクスポートまたは保存できますか?
ストップウォッチは現在、ラップデータの保存やエクスポートをサポートしていません。すべてのラップ記録はメモリに保持され、タイマーをリセットするかページを閉じるとクリアされます。永続的な記録には、表示された時間を手動でコピーするか、専用のフィットネストラッカーを使用することを検討してください。
なぜDate.now()ではなくperformance.now()を使うのですか?
performance.now()は単調です — 決して後戻りしません。Date.now()はシステム時刻が調整されると(NTP同期、手動変更、夏時間)数秒から数分ジャンプする可能性があります。短時間の計時にはperformance.now()が正しい選択です。また、Date.now()のミリ秒分解能とは異なり、サブミリ秒の分解能も提供します。
データはサーバーにアップロードされますか?
いいえ。ストップウォッチは完全にブラウザ内で実行されます。計時データ、ラップ記録、使用情報がサーバーに送信されることはありません。一度読み込まれたページはオフラインでも動作します。
ストップウォッチとカウントダウンタイマーの違いは何ですか?
ストップウォッチはゼロから上方向に経過時間を測定し、「どのくらい時間がかかったか?」に答えます。カウントダウンタイマーは設定された時間からゼロまでカウントダウンし、「残り時間はどのくらいか?」に答えます。このツールはストップウォッチです。カウントダウン機能が必要な場合は、カウントダウンタイマーツールを使用してください。