A Duration Foi Criada Como Indicador - Duration: Entenda O Que é, Fórmula e Como Funciona
Duration: Entenda O Que é, Fórmula e Como Funciona

O que é e como funciona na prática

Vim a descobrir esse sistema por acaso em 2019, quando comecei a testar cronômetros na academia pra medir tempo de descanso entre séries. O negócio é simples: você define um período de duração e ele vira referência pra outra coisa — seja o entre exercícios, a contagem regressiva de uma pausa, ou o tempo máximo que algo pode existir antes de mudar de estado. Não tem mágica. No início eu achava que era só um timer bonitinho. Depois percebi que a parte difícil não é criar o contador, é fazer ele não quebrar quando o usuário muda de tela no meio da contagem, ou quando o dispositivo vai pra suspensão. Eu tive um casoSpecifico: num projeto interno de rastreamento de tempo de retenção, o indicador voltava pra zero toda vez que o app ia pra background no Android. A solução foi escutar o evento `onPause` do ciclo de vida e salvar o timestamp de início num `SharedPreferences`, calculando a duração real na volta. Parece bobeira, mas é isso que separa um protótipo de algo que sobrevive num dispositivo real.

a duration foi criada como indicador

A ideia central é essa: transformar um intervalo de tempo em algo que indique o status de outra variável. Por exemplo, num treino, a duração de descanso indica se seu corpo já recuperou o suficiente pra próxima série. Num sistema de filas, a duração de espera indica o nível de congestionamento. Você não está medindo tempo por vaidade — você está usando o tempo comoproxy pra alguma coisa mais importante. Na minha experiência, os dados mais úteis geralmente vêm de doisjeitos: duracãopura (quanto tempo algo durou) e intervalos repetitivos (tempo entre eventos). A diferença é sutil mas importante. O primeiro exige precisão de milissegundo. O segundo tolera variação maior porque você está procurando padrão, não exatidão absoluta.

Implementação básica

Se você tá começando do zero, esquece frameworks por um momento. O problema essencial cabe em trêslinhas de lógica: Passo 1: Armazene o timestamp de início quando o usuário dispara a ação. No JavaScript moderno, `performance.now()` é melhor que `Date.now()` porque não é afetado por ajustes de relógio do sistema. No mobile, use APIs nativas equivalentes — no iOS é `CFAbsoluteTimeGetCurrent()`, no Android é `SystemClock.elapsedRealtimeNanos()`.

👉 Clique no botão abaixo para saber mais sobre o assunto!

Passo 2: Calcule a diferença quando quiser ler o valor. Subtraia o timestamp de início do timestamp atual. Não use variáveis globais pra isso — encapsule num objeto ou fechamento. Isso evita que loops de animação fiquem desincronizados se o main thread travar. Passo 3: Trate casos extremos. Se o usuário fechar a aba, minimize a janela, ou o dispositivo vai pra modo economia, seu cálculo precisa sobreviver. No web, use a Page Visibility API pra pausar a contagem. No mobile, salve estado antes de cada transição de ciclo de vida. Eu perdi três dias num projeto porque não pensei nisso — o indicador mostrava 45 segundos quando na verdade eram 12 minutos, e ninguém percebeu até o relatório final.

Erros comuns que você provavelmente vai cometer

Confiar no `setInterval` pra tudo: Ele não é preciso. Em navegadores modernos, o mínimo é 4ms mesmo quando você pede 1ms. E se a aba ficar em background? O timer basicallypausa. Use `requestAnimationFrame` pra animações ou o novo `scheduler.yield()` quando disponível. Para contagens passivas, considere `setTimeout` encadeado com recalculo de timestamp. Ignorar fusos horários e DST: Se sua duração é absoluta (ex: "esse arquivo expira em 24 horas"), use timestamps Unix (epoch). Se é relativa ao relógio da parede (ex: "reunião às 14h"), use objetos `Date` com zone-awareness. Misturar os dois é receita pra bugs que aparecem só em certos meses do ano.

Não testar em hardware limitado: Meu colega desenvolveu um indicador de duração pra smartwatch e esqueceu que o processador roda a 16MHz. A animação travava, o timer dessincronizava, e o usuário via números pulando de forma aleatória. Perfile no dispositivo-alvo antes de acreditar nos benchmarks da máquina de desenvolvimento.

Alternativas quando isso não funciona

Se você precisa de alta precisão (< 1ms) em ambiente web, considere Web Workers isolados. Se o uso é esporádico (usuário ativa, faz coisa, volta 20 minutos depois), salve estado persistente em `localStorage` ou IndexedDB, não confie em memória volátil. Se o problema é visual (o usuário precisa emver o tempo passando de forma intuitiva), pense em progress bars circulares ou contadores com easing — a é tão importante quanto a matemática aqui. Num caso recente, precisei substituir um sistema baseado em duração pura por um baseado em eventos discretos. O problema era que o tempo total não refletia o esforço real — o usuário ficava 3 horas num fluxo, mas só 47 minutos interagindo ativamente. Mudei pra medir intervalos ativos vs. inativos, e a métrica ganhou utilidade prática imediata. Às vezes o indicador certo não é "quanto tempo passou", é "quanto tempo realmente importou".