Duração total de intervalos de tempo
Cole uma lista de intervalos de tempo e receba o tempo real que eles cobrem: de 10:00 a 12:00 e de 11:00 a 13:00 UTC cobrem 3 horas, e não as 5 de uma soma simples. Intervalos sobrepostos ou encostados são unidos antes. Grátis no seu navegador.
- Grátis
- Funciona no seu navegador
- Sem cadastro
- Seus dados não saem do seu aparelho
Executar grátis
Equipes de operações, scripts de folha de pagamento e ferramentas de SLA frequentemente mantêm muitos intervalos de tempo explícitos que se sobrepõem: plantões, reservas de equipamentos, janelas de indisponibilidade ou sessões faturáveis. Somar cada intervalo de forma ingênua conta duas vezes os minutos compartilhados. Esta calculadora de duração total de intervalos de tempo aceita uma lista de pares início e fim em ISO-8601, normaliza cada limite para UTC absoluto com aritmética gregoriana pura, mescla intervalos que se sobrepõem ou se tocam e devolve o comprimento do trecho coberto em milissegundos, segundos e horas, além de um detalhamento em dias, horas, minutos e segundos. Reservas adjacentes que se encontram em um extremo tornam-se um segmento contínuo, de modo que um ponto de contato de comprimento zero nunca infla o total.
O que a duração coberta significa após mesclar sobreposições
A duração coberta mede a união dos seus intervalos na linha do tempo absoluta, não a soma de cada comprimento bruto. Se Alice reserva das dez às doze e Bob das onze às treze no mesmo dia UTC, a soma ingênua é cinco horas, enquanto o trecho coberto é apenas três horas das dez às treze. Intervalos que se tocam, como terminar às doze e começar às doze, mesclam-se num bloco contínuo, o modelo correto de tempo contínuo para cobertura, ocupação e disponibilidade de SLA.
Intervalos de comprimento zero e invertidos são rejeitados porque não definem um trecho aberto positivo.
Contrato de entrada, limites ISO e formato da resposta
Cada objeto deve incluir os campos string start e end no formato ISO-8601: ano de quatro dígitos, mês e dia, opcionalmente seguidos de hora do dia com horas, minutos, segundos e uma parte fracionária opcional de segundo. Um Z final significa UTC; um deslocamento numérico como mais zero dois dois-pontos zero zero ou menos zero cinco dois-pontos zero zero desloca os campos locais para UTC absoluto antes da mescla. Valores só de data são tratados como meia-noite UTC para que janelas de dia funcionem sem inventar um relógio.
Campos opcionais nulos nunca são emitidos. Validação falha não consome saldo.
Onde somar o tempo coberto faz diferença
Plataformas de força de trabalho e plantão mesclam fragmentos de turno para que folha e regras de fadiga cobrem cobertura contínua em vez de horas duplas sobrepostas. Sistemas de reserva de instalações e laboratórios calculam a ocupação de uma sala ou instrumento quando as reservas se empilham, alimentando painéis de utilização sem funções SQL de janela em cada relatório. Páginas de confiabilidade e status transformam muitos intervalos parciais de incidentes numa única duração de indisponibilidade coberta para a matemática mensal de SLA.
Rastreadores de tempo de projeto consolidam logs de sessão duplicados de clientes móveis e desktop que registraram o mesmo trabalho duas vezes com relógios ligeiramente diferentes. Combine esta ferramenta com a interseção de dois intervalos quando precisar da sobreposição de exatamente dois intervalos, ou com utilitários de humanização de duração quando só quiser texto legível a partir de uma contagem de segundos.
Casos de uso
Totais de cobertura de plantão e turnos
Mescla janelas de serviço sobrepostas de uma equipe para que folha e fadiga usem horas cobertas em vez de contar duas vezes turnos concorrentes.
Ocupação de salas e recursos
Soma a união de reservas de uma bancada de laboratório ou sala de reunião quando se sobrepõem, para relatórios de utilização sem SQL bruto.
Indisponibilidade SLA por outages parciais
Colapsa muitos intervalos de incidente numa única duração de outage coberta para a matemática mensal de disponibilidade e exportações de status.
Perguntas frequentes
Os minutos sobrepostos são contados duas vezes?
Não. Os intervalos são ordenados e mesclados antes da soma, de modo que a cobertura compartilhada contribui apenas uma vez para a duração total coberta.
E se dois intervalos apenas se tocarem num extremo?
Eles se mesclam num segmento contínuo. Limites que se tocam não criam um intervalo e não adicionam duração extra além do trecho combinado.
Quantos intervalos posso informar?
De um a 200 na mesma lista. Cada um precisa de início e fim, e o início deve vir estritamente antes do fim; intervalos de duração zero ou invertidos são recusados.
Posso digitar datas sem horário?
Sim. Uma data sozinha é lida como meia-noite UTC, o que facilita trabalhar por dia. Os horários podem ter Z para UTC ou um deslocamento numérico, e tudo é convertido para UTC antes da união.
Como vejo quais intervalos foram unidos?
O resultado lista cada trecho unido com início, fim e duração próprios, e mostra quantos intervalos você informou ao lado de quantos restaram após a união, para conferir o total.
Ferramentas relacionadas
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/intervals-total-duration \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"intervals":[{"start":"2020-01-01T10:00:00Z","end":"2020-01-01T12:00:00Z"},{"start":"2020-01-01T11:00:00Z","end":"2020-01-01T13:00:00Z"}]}'const res = await fetch("https://api.kit.forhosting.com/date/intervals-total-duration", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"intervals": [
{
"start": "2020-01-01T10:00:00Z",
"end": "2020-01-01T12:00:00Z"
},
{
"start": "2020-01-01T11:00:00Z",
"end": "2020-01-01T13:00:00Z"
}
]
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/date/intervals-total-duration",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"intervals": [
{
"start": "2020-01-01T10:00:00Z",
"end": "2020-01-01T12:00:00Z"
},
{
"start": "2020-01-01T11:00:00Z",
"end": "2020-01-01T13:00:00Z"
}
]
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/date/intervals-total-duration", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"intervals":[{"start":"2020-01-01T10:00:00Z","end":"2020-01-01T12:00:00Z"},{"start":"2020-01-01T11:00:00Z","end":"2020-01-01T13:00:00Z"}]}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"intervals":[{"start":"2020-01-01T10:00:00Z","end":"2020-01-01T12:00:00Z"},{"start":"2020-01-01T11:00:00Z","end":"2020-01-01T13:00:00Z"}]}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/date/intervals-total-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
{
"intervals": [
{
"start": "2020-01-01T10:00:00Z",
"end": "2020-01-01T12:00:00Z"
},
{
"start": "2020-01-01T11:00:00Z",
"end": "2020-01-01T13:00:00Z"
}
]
}Exemplo de resposta
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "date.intervals_total_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. |
Notas técnicas
Formatos ISO inválidos, intervalos invertidos e listas vazias falham com invalid_input e não são cobrados.
O que a duração coberta significa após mesclar sobreposições
Este endpoint implementa o algoritmo clássico de ordenar e mesclar: cada início e fim é convertido em milissegundos de época UTC, a lista é ordenada pela hora de início, e cada intervalo seguinte ou estende o segmento aberto atual quando começa em ou antes do fim desse segmento, ou abre um novo segmento quando há um intervalo positivo. A resposta informa input_count versus merged_count para que você veja quanta consolidação ocorreu, e lista cada segmento mesclado com seu próprio início, fim e duração para auditorias. Use total_duration_ms quando precisar de uma medida inteira principal; use total_duration_hours quando os painéis esperarem horas fracionárias arredondadas a doze casas decimais estáveis; use days, hours, minutes e seconds juntos ao renderizar uma linha legível sem refazer a divisão.
Contrato de entrada, limites ISO e formato da resposta
Envie um corpo JSON com um array intervals obrigatório de um a duzentos objetos. Após a normalização, start deve ser estritamente anterior a end; limites iguais ou invertidos falham com invalid_input indicando o índice do intervalo. Em caso de sucesso o corpo inclui input_count, merged_count, total_duration_ms, total_duration_seconds, total_duration_hours, os campos de detalhamento não negativos days, hours, minutes, seconds e milliseconds, uma string formatada compacta como zero d três h zero m zero s, o array ordenado merged_intervals com extremos ISO UTC, e method com valor intervals_total_duration. Exemplo: duas janelas de horas sobrepostas das dez às doze e das onze às treze UTC mesclam-se num segmento de três horas e total_duration_ms de dez milhões e oitocentos mil. Mantenha a lista abaixo do máximo publicado para que os Workers de borda respeitem a memória e ainda cubram lotes realistas.
Onde uma API de duração total de intervalos gera valor
Como a implementação é pure parse de nível A, cada chamada bem-sucedida custa o preço base publicado US$ 0,002 sem tokens de modelo e sem rede de saída. Fixe merged_intervals e total_duration_ms nos testes para que refatorações não alterem em silêncio a semântica de mescla ao tocar.
Perguntas técnicas
Como calcular a duração total de intervalos de tempo sobrepostos?
Envie JSON com intervals como array de {start, end} em ISO-8601. A API mescla sobreposições em UTC e devolve total_duration_ms, total_duration_seconds, total_duration_hours e merged_intervals.
Quais erros de entrada são rejeitados?
Intervals vazios ou ausentes, não objetos, strings ISO inválidas, dias de calendário impossíveis e start não estritamente anterior a end falham com invalid_input e não são cobrados.
Quanto custa a ferramenta de duração total de intervalos de tempo?
A ferramenta no navegador é gratuita. Solicitações API usam saldo KIT pré-pago a US$ 0,002 por chamada bem-sucedida; entrada inválida não é cobrada.