在线秒表
免费在线秒表,支持毫秒级精度和分段计时
什么是在线秒表?
在线秒表是一种从零开始向上计时的精密计时工具,通常支持毫秒级精度。与倒计时器不同,秒表回答的是「这件事花了多长时间?」,非常适合运动训练、实验记录、演讲排练、烹饪计时、集中编程等需要追踪耗时的场景。本工具完全在浏览器中运行,使用 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() 只有毫秒级。
有任何数据会被上传到服务器吗?
不会。秒表完全在浏览器中运行。计时数据、计次记录或使用信息不会发送到任何服务器。页面加载后即可离线使用。
秒表和倒计时器有什么区别?
秒表从零开始向上计时,回答「花了多长时间?」。倒计时器从设定时长开始递减到零,回答「还剩多长时间?」。本工具是秒表;如需倒计时功能,请使用倒计时器工具。