在线秒表

精确的在线秒表,支持计圈、分段时间、键盘快捷键和一键复制成绩列表。使用单调时钟,后台标签页被节流也不会走偏。

不会走偏的秒表。 用按钮或键盘开始、暂停和计圈。每一圈同时记录本圈用时和累计总时,整份列表可以一次性复制出去。

00:00:00.00

空格开始 / 暂停,L 计圈,R 重置。

圈次
# 本圈 累计

还没有记录任何圈次。

浏览器秒表怎样才算准确

用时间戳,而不是用累加计数

做秒表最直觉的方式是每次定时器触发就往计数器上加一个固定值。这也是错误的方式,因为浏览器里的定时器并不保证按时触发。切到别的标签页,间隔会被节流到每秒一次甚至完全暂停;合上笔记本,它就彻底停了。用这种方式做出来的计数器会丢时间,而且丢了就再也补不回来。

本秒表的做法是记录开始的那一刻,然后在每次重绘时用当前时刻减去它。没有任何东西在累加,因此也就没有任何误差可以累积。标签页被节流时显示会停止刷新,但底层时钟照常前进,你切回来后的第一帧显示的就是正确的已用时间,而不是一个在你离开期间落后了的数字。

用单调时钟,不用墙上时钟

这里使用的是 performance.now(),它从页面加载开始计数,并且只会向前走。这一点很重要,因为墙上时钟——也就是 Date.now() 报告的时间——是会跳变的。NTP 校正会微调它,夏令时切换会移动它,用户改一下系统时间就能让它在任意方向上跳几个小时。

从墙上时钟读数的秒表会完整继承这些跳变。如果一次 NTP 同步恰好发生在测量过程中,你记录的间隔就是错的,而界面上不会有任何迹象提示你。单调时钟没有这种失效模式:它不与任何东西同步,无法被调整,它唯一测量的就是流逝的时间。

本圈与累计:为什么两个都要显示

每一行记录两个数字。累计是从开始到该圈的时间,本圈是距上一圈的时间。它们回答的是不同的问题,搞清楚自己在看哪一个很有必要。

给跑者计八圈时,本圈时间告诉你他是在保持配速、掉速还是在冲刺——这是每一圈的表现。累计时间告诉你他相对于全程目标成绩处在什么位置。只看累计时很难发现掉速,因为每个数字都包含了它之前的全部时间;只看本圈又会丢掉整体结果。两个都显示,你就能在同一张表里同时读出配速和进度,导出的内容也保留了这两列,方便粘贴到任何地方。

全部在浏览器本地用原生 JavaScript 运行,不依赖第三方库,不上传数据,不做追踪。

常见问题

计时精度有多高?
显示精确到百分之一秒,底层时钟精度在毫秒以下。实际瓶颈是你按按钮的反应时间,而不是计时器本身。
切换标签页后还会继续走吗?
会。因为浏览器会节流后台标签页,画面刷新会暂停,但已用时间是根据时间戳算出来的,所以切回来时显示的立刻就是正确值。
本圈和累计有什么区别?
累计是从开始到该圈的总时间,本圈是距离上一圈的时间。本圈反映配速,累计反映相对于全程的进度。
刷新页面后圈次会保留吗?
不会。所有数据只存在内存中,刷新即清空。如果需要保留,请在离开页面前先复制圈次列表。
有哪些键盘快捷键?
空格开始 / 暂停,L 计圈,R 重置。在输入框内打字时这些快捷键会被忽略,不会误触发。
暂停状态下能计圈吗?
不能,按钮此时是禁用的。计圈标记的是一次进行中的测量里的某个时刻,时钟停着的时候记一圈只会重复当前的累计值。