Онлайн секундомер
Бесплатный онлайн секундомер с миллисекундной точностью и записью кругов
Что такое Онлайн Секундомер?
Онлайн секундомер — это точный инструмент измерения времени, который отсчитывает прошедшее время от нуля вверх, обычно с миллисекундным разрешением. В отличие от таймера обратного отсчёта, секундомер отвечает на вопрос «сколько времени это заняло?», что делает его идеальным для спортивных тренировок, лабораторных экспериментов, презентаций, приготовления пищи, программирования и любых задач, где нужно отслеживать длительность, а не соблюдать фиксированный конечный срок. Инструмент полностью работает в браузере, используя requestAnimationFrame для плавного обновления дисплея и performance.now() для монотонного измерения времени, поэтому он остаётся точным даже при корректировке системных часов. Запись кругов позволяет фиксировать промежуточные результаты с выделением лучшего/худшего круга, и все данные остаются локальными — ничего не загружается.
Как использовать
Быстрый старт
- Нажмите «Старт» для начала — на дисплее отображается часы:минуты:секунды.миллисекунды
- Нажмите «Круг» во время работы, чтобы записать промежуточное время
- Нажмите «Пауза», чтобы зафиксировать дисплей, затем «Старт» для продолжения
- Нажмите «Сброс», чтобы очистить таймер и все записи кругов
Советы
- Секундомер использует requestAnimationFrame для обновления дисплея ~16 мс и performance.now() для точного измерения.
- Держите вкладку видимой для наиболее плавного отображения. Фоновые вкладки могут ограничивать кадры анимации.
- Время кругов выделяется цветом: зелёный — самый быстрый круг, красный — самый медленный.
Сценарии использования
Технический принцип
Движок секундомера полностью избегает подверженного дрейфу шаблона setInterval. Вместо этого он использует requestAnimationFrame (rAF) для обновления дисплея и performance.now() как авторитетный источник времени. Когда пользователь нажимает «Старт», движок записывает текущую метку времени performance.now() как startTime. На каждом кадре анимации он вычисляет elapsed = accumulated + (performance.now() - startTime), где accumulated хранит общее прошедшее время до последней паузы. Эта двухпеременная модель (накопленное время + дельта выполнения) корректно обрабатывает циклы паузы/возобновления без потери субмиллисекундной точности. performance.now() выбран вместо Date.now(), потому что он монотонен — он никогда не откатывается назад из-за коррекций NTP, ручного изменения часов или перехода на летнее время. Он также обеспечивает субмиллисекундное разрешение (обычно 5 мкс в современных браузерах), что делает его правильными часами для краткосрочного высокоточного хронометража. Обратный вызов rAF ограничен частотой обновления дисплея (обычно 60 Гц = ~16,67 мс, до 120 Гц на дисплеях с высокой частотой обновления), поэтому визуальное обновление плавное, но не является эталонным значением — фактическое прошедшее время берётся из вычисления performance.now(), которое постоянно корректно. Запись кругов фиксирует текущее elapsedMs в момент нажатия кнопки «Круг», вычисляя разницу с общим временем предыдущего круга. Лучшие и худшие круги определяются сравнением всех разниц кругов с помощью Math.min/Math.max, и дисплей выделяет их зелёным и красным стилями соответственно. Всё состояние хранится в хуках React useState внутри клиентского компонента, и никакие данные не сохраняются и не передаются — секундомер эфемерен по своей природе, полностью сбрасываясь при закрытии страницы или нажатии кнопки «Сброс».
- performance.now() предоставляет монотонные метки времени с субмиллисекундной точностью — невосприимчив к изменениям системных часов.
- requestAnimationFrame управляет обновлением дисплея на частоте обновления (60–120 Гц) для плавного рендеринга.
- Модель накопленного времени + дельты выполнения обрабатывает паузу/возобновление без потери точности.
- Разницы кругов вычисляются как 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 микросекунд). Дисплей обновляется примерно 60 раз в секунду через requestAnimationFrame, поэтому визуальное обновление находится в пределах 16 мс от истинного значения. Для большинства практических целей — спорт, приготовление пищи, презентации — этого более чем достаточно.
Продолжает ли секундомер работать при переключении вкладок?
Да. Прошедшее время вычисляется из абсолютной метки времени performance.now(), а не из накопительных тиков. При возвращении на вкладку дисплей немедленно показывает правильное прошедшее время. Однако requestAnimationFrame ограничивается в фоновых вкладках, поэтому визуальное обновление может приостанавливаться до вашего возвращения.
Что происходит, когда компьютер переходит в спящий режим?
performance.now() монотонен, но не продвигается, пока система приостановлена. При пробуждении компьютера дисплей секундомера покажет прошедшее время так, как будто система никогда не спала — он НЕ будет включать продолжительность сна. Это правильное поведение для большинства случаев использования хронометража.
Могу ли я экспортировать или сохранить время кругов?
Секундомер в настоящее время не поддерживает сохранение или экспорт данных кругов. Все записи кругов хранятся в памяти и очищаются при сбросе таймера или закрытии страницы. Для постоянной записи скопируйте отображаемое время вручную или используйте специальный фитнес-трекер.
Почему используется performance.now() вместо Date.now()?
performance.now() монотонен — он никогда не идёт назад. Date.now() может прыгать на секунды или минуты при корректировке системных часов (синхронизация NTP, ручное изменение, переход на летнее время). Для краткосрочного хронометража performance.now() — правильный выбор. Он также предлагает субмиллисекундное разрешение, в отличие от миллисекундного разрешения Date.now().
Загружаются ли какие-либо данные на сервер?
Нет. Секундомер полностью работает в вашем браузере. Никакие данные хронометража, записи кругов или информация об использовании не отправляются на сервер. Страница работает офлайн после загрузки.
В чём разница между секундомером и таймером обратного отсчёта?
Секундомер измеряет прошедшее время вверх от нуля — он отвечает «сколько времени это заняло?». Таймер обратного отсчёта начинает с установленной длительности и считает вниз до нуля — он отвечает «сколько времени осталось?». Этот инструмент — секундомер; для функциональности обратного отсчёта используйте инструмент «Таймер обратного отсчёта».