Calculadora de tempo sobreposto entre dois intervalos
Esta calculadora mede exatamente quanto tempo dois intervalos explícitos de data e hora têm em comum.
Executar grátis
Informe o início e o fim de cada intervalo no formato ISO 8601, com Z ou um deslocamento UTC numérico. O cálculo converte todos os limites para a mesma linha do tempo UTC, seleciona o início posterior e o fim anterior e retorna a duração compartilhada em milissegundos, segundos, minutos e horas. Intervalos separados ou que apenas se encostam retornam zero, facilitando o uso em agendas, faturamento, monitoramento e relatórios.
Defina os dois intervalos com limites inequívocos
Informe quatro valores: início e fim do primeiro intervalo, seguidos pelo início e fim do segundo. Cada valor deve ser uma data e hora ISO 8601 completa, com data civil, horário incluindo segundos e Z ou deslocamento explícito, como +02:00 ou -05:30. Exigir o deslocamento evita que um horário local seja interpretado de maneira diferente em outro computador. Cada início deve ser anterior ao respectivo fim. A calculadora considera intervalos semiabertos: o início pertence ao intervalo, enquanto o fim é o limite excluído. Essa convenção evita contar duas vezes o mesmo instante quando reservas, turnos ou janelas consecutivas se encontram. São aceitos de um a três dígitos fracionários nos segundos, normalizados para milissegundos. Datas e componentes de horário são validados diretamente; valores impossíveis produzem erro de entrada. Use sempre os mesmos quatro campos, mesmo quando você não espera uma interseção.
Entenda o cálculo determinístico em UTC
Antes da comparação, o cálculo posiciona os quatro limites em uma única linha do tempo UTC. Um valor terminado em Z já está em UTC. De um valor com deslocamento positivo, esse deslocamento é subtraído; a um valor com deslocamento negativo, ele é somado. Assim, duas datas escritas de formas diferentes podem representar o mesmo instante. A sobreposição começa no mais tardio dos dois inícios e termina no mais cedo dos dois finais. Se esse fim ocorrer depois do início calculado, a diferença será a duração compartilhada; caso contrário, ela será exatamente zero. A implementação usa aritmética do calendário gregoriano e milissegundos inteiros, sem consultar relógio, localidade, banco de fusos, rede, aleatoriedade ou Date do JavaScript. Entradas iguais sempre geram resultados iguais. A saída apresenta uma única duração em milissegundos, segundos, minutos e horas, permitindo que você escolha a unidade adequada ao seu fluxo.
Use o resultado com segurança em fluxos reais
Use a duração de sobreposição sempre que precisar comparar duas janelas conhecidas: um turno com uma licença aprovada, a operação de um equipamento com uma faixa tarifária, um incidente com o horário de atendimento ou uma reserva com um bloco disponível. Um valor positivo mostra quanto tempo existe em comum, não apenas se há interseção. Zero significa que os intervalos estão separados ou que um termina exatamente quando o outro começa; nos dois casos, não há tempo decorrido compartilhado pela convenção semiaberta. Para valores financeiros ou cotas, use overlap_milliseconds ou overlap_seconds como fonte e aplique seu arredondamento documentado apenas depois. Não arredonde os limites antes, salvo se isso fizer parte da sua política. O endpoint aceita somente deslocamentos explícitos; não aceita nomes como America/New_York nem deduz horário de verão. Resolva horários locais antes da chamada. A API custa US$ 0,002 por solicitação, e o navegador executa localmente a mesma lógica para verificações interativas.
Casos de uso
Medir cobertura de turnos
Calcule quanto de um turno coincide com uma janela operacional atendida, remunerada ou aprovada.
Alocar tempo de incidentes
Meça a parte de uma indisponibilidade ocorrida durante um período contratual de suporte ou serviço.
Verificar conflitos de reservas
Quantifique o tempo compartilhado entre duas reservas em vez de receber apenas uma resposta positiva ou negativa.
Perguntas frequentes
O que acontece quando os intervalos não se sobrepõem?
Os quatro campos de duração retornam zero. Isso também ocorre quando um intervalo termina exatamente no início do outro.
Deslocamentos UTC diferentes são aceitos?
Sim. Cada limite pode usar Z ou seu próprio deslocamento numérico, e todos são comparados na mesma linha do tempo UTC.
Os extremos dos intervalos são inclusivos?
O cálculo usa intervalos semiabertos: o início é incluído e o fim é excluído. Portanto, intervalos adjacentes têm duração comum zero.
O cálculo usa o fuso horário do servidor?
Não. Ele usa aritmética gregoriana e de deslocamentos sem Date, banco de fusos, relógio da máquina ou localidade.
Quanto custa uma solicitação à API?
O preço é US$ 0,002 por solicitação. A execução interativa no navegador não gera cobrança da API.
Para desenvolvedores — acesso via API
Tudo nesta página está disponível via API. Esta seção é para equipes que querem integrar a ferramenta aos próprios sistemas; quem não precisa disso pode simplesmente usar a ferramenta acima.
Endpoint
Autenticação por token Bearer. Um único POST coloca a tarefa na fila; o resultado chega por webhook ou link assinado.
Chame do seu código
curl -X POST https://api.kit.forhosting.com/date/overlap-duration \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"first_start":"2026-07-25T09:00:00Z","first_end":"2026-07-25T12:30:00Z","second_start":"2026-07-25T11:15:00+00:00","second_end":"2026-07-25T14:00:00+00:00"}'const res = await fetch("https://api.kit.forhosting.com/date/overlap-duration", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"first_start": "2026-07-25T09:00:00Z",
"first_end": "2026-07-25T12:30:00Z",
"second_start": "2026-07-25T11:15:00+00:00",
"second_end": "2026-07-25T14:00:00+00:00"
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/date/overlap-duration",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"first_start": "2026-07-25T09:00:00Z",
"first_end": "2026-07-25T12:30:00Z",
"second_start": "2026-07-25T11:15:00+00:00",
"second_end": "2026-07-25T14:00:00+00:00"
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/date/overlap-duration", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"first_start":"2026-07-25T09:00:00Z","first_end":"2026-07-25T12:30:00Z","second_start":"2026-07-25T11:15:00+00:00","second_end":"2026-07-25T14:00:00+00:00"}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"first_start":"2026-07-25T09:00:00Z","first_end":"2026-07-25T12:30:00Z","second_start":"2026-07-25T11:15:00+00:00","second_end":"2026-07-25T14:00:00+00:00"}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/date/overlap-duration", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Exemplo de requisição
{
"first_start": "2026-07-25T09:00:00Z",
"first_end": "2026-07-25T12:30:00Z",
"second_start": "2026-07-25T11:15:00+00:00",
"second_end": "2026-07-25T14:00:00+00:00"
}Exemplo de resposta
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "date.overlap_duration",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}A API é assíncrona: cada chamada devolve um task_id na hora. Se preferir polling, consulte o status a até 1 requisição por segundo.
Preço
Preço publicado, sem tokens nem créditos escondidos. Tarefa que falha não é cobrada.
Erros
| HTTP | Código | O que significa |
|---|---|---|
401 | unauthorized | Token ausente ou inválido. Confira o header Authorization. |
402 | insufficient_balance | Saldo insuficiente para esta tarefa. Faça uma recarga e tente de novo. |
404 | unknown_type | Esse tipo de tarefa não existe. Confira o campo type no catálogo. |
429 | rate_limited | Muitas requisições em pouco tempo. Espere um instante e tente de novo. |