Interseção de intervalos
Digite dois intervalos de tempo e receba a parte que eles compartilham: de 10:00 a 12:00 e de 11:00 a 13:00 UTC se sobrepõem de 11:00 a 12:00, uma hora exata. Se só se tocam, o resultado fica vazio. Grátis no seu navegador.
- Grátis
- Funciona no seu navegador
- Sem cadastro
- Seus dados não saem do seu aparelho
Executar grátis
Exemplo resolvido
- Início do intervalo A
- 2020-01-01T10:00:00.000Z
- Fim do intervalo A
- 2020-01-01T12:00:00.000Z
- Início do intervalo B
- 2020-01-01T11:00:00.000Z
- Fim do intervalo B
- 2020-01-01T13:00:00.000Z
- Início da interseção
- 2020-01-01T11:00:00.000Z
- Fim da interseção
- 2020-01-01T12:00:00.000Z
- Duração da interseção (milissegundos)
- 3.600.000
- Duração da interseção (horas)
- 1
Calcula a sobreposição de dois intervalos ISO com ordem estrita, duração em milissegundos e horas. Grátis, determinístico e privado no navegador.
O que significa dois intervalos se sobreporem
Dois intervalos de tempo se sobrepõem quando existe um trecho que pertence aos dois. Pense em duas reservas de sala ou em duas janelas de incidentes num painel de suporte: a pergunta não é quanto dura cada um, e sim que parte eles têm em comum. A regra é curta. O trecho comum começa no mais tardio dos dois inícios e termina no mais cedo dos dois fins. Se esse início vem estritamente antes desse fim, há sobreposição e você recebe o trecho com a duração em milissegundos e em horas. Para 10:00 a 12:00 e 11:00 a 13:00 UTC, a sobreposição vai de 11:00 a 12:00, uma hora exata.
Os casos-limite que confundem
Dois intervalos que só se tocam, como um que termina às 12:00 e outro que começa às 12:00, não compartilham tempo, porque o fim é tratado como excluído; o resultado fica vazio e as duas durações valem zero. A ferramenta nunca devolve a união dos dois intervalos, só a parte em comum. Cada valor é um horário completo no padrão ISO 8601 e o resultado sai em UTC. Um intervalo cujo fim vem antes do início, ou um valor ausente ou inválido, é recusado em vez de virar uma sobreposição vazia.
Entradas, saídas e casos limite
Os quatro campos são cadeias obrigatórias para que a sonda do esquema possa montar uma amostra completa a partir dos exemplos publicados. Intervalos adjacentes que só se tocam em um ponto produzem resultado vazio porque a comparação é estritamente menor, o que combina com sistemas de agenda que tratam o fim como exclusivo. Janelas sobrepostas devolvem apenas o trecho compartilhado, nunca a união.
Tipos incorretos, campos ausentes e faixas invertidas falham cedo para que clientes não vejam sobreposições nulas silenciosas.
Casos de uso
Sobreposição de reuniões
Encontre a janela compartilhada entre duas reservas com durações estáveis.
Painéis de suporte
Destaque quando duas janelas de incidente coincidem sem planilha.
Automação
Chame a mesma função pura a partir de scripts que fundem calendários.
Perguntas frequentes
É grátis?
Sim. Tier A roda inteiramente no navegador sem conta.
Chama a rede?
Não. O motor parse mantém tudo no dispositivo.
Os resultados são estáveis?
Sim. Matemática determinística e exemplos dourados fixam o contrato.
Como é calculada a sobreposição de dois intervalos?
A parte em comum começa no maior dos dois inícios e termina no menor dos dois fins. Se esse início vem antes desse fim, os intervalos compartilham tempo; caso contrário, o resultado fica vazio e a duração é zero.
E se um intervalo termina exatamente quando o outro começa?
O resultado fica vazio. O fim de cada intervalo é tratado como excluído, como na maioria dos sistemas de agendamento, então dois intervalos que só se tocam em um instante não compartilham tempo.
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/interval-intersection \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"a_start":"2020-01-01T10:00:00.000Z","a_end":"2020-01-01T12:00:00.000Z","b_start":"2020-01-01T11:00:00.000Z","b_end":"2020-01-01T13:00:00.000Z"}'const res = await fetch("https://api.kit.forhosting.com/date/interval-intersection", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"a_start": "2020-01-01T10:00:00.000Z",
"a_end": "2020-01-01T12:00:00.000Z",
"b_start": "2020-01-01T11:00:00.000Z",
"b_end": "2020-01-01T13:00:00.000Z"
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/date/interval-intersection",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"a_start": "2020-01-01T10:00:00.000Z",
"a_end": "2020-01-01T12:00:00.000Z",
"b_start": "2020-01-01T11:00:00.000Z",
"b_end": "2020-01-01T13:00:00.000Z"
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/date/interval-intersection", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"a_start":"2020-01-01T10:00:00.000Z","a_end":"2020-01-01T12:00:00.000Z","b_start":"2020-01-01T11:00:00.000Z","b_end":"2020-01-01T13:00:00.000Z"}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"a_start":"2020-01-01T10:00:00.000Z","a_end":"2020-01-01T12:00:00.000Z","b_start":"2020-01-01T11:00:00.000Z","b_end":"2020-01-01T13:00:00.000Z"}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/date/interval-intersection", 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
{
"a_start": "2020-01-01T10:00:00.000Z",
"a_end": "2020-01-01T12:00:00.000Z",
"b_start": "2020-01-01T11:00:00.000Z",
"b_end": "2020-01-01T13:00:00.000Z"
}Exemplo de resposta
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "date.interval_intersection",
"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
Como funciona a interseção de intervalos
O início da interseção é o máximo dos dois inícios e o fim é o mínimo dos dois fins. Dois intervalos civis A e B são definidos por quatro carimbos ISO-8601: a_start, a_end, b_start e b_end. O motor analisa cada extremo com o parser Date do ambiente, rejeita valores que não são cadeias ou não podem ser analisados com mensagens invalid_input claras que nomeiam o campo, e exige que a_start seja estritamente menor que a_end e b_start estritamente menor que b_end. Quando o início é estritamente menor que o fim o resultado não está vazio e carrega start e end como cadeias ISO UTC mais duration_ms e duration_hours arredondadas a um decimal estável; caso contrário empty é verdadeiro, start e end são null e ambos os campos de duração valem zero.
Entradas, saídas e casos limite
Os exemplos dourados cobrem uma sobreposição de uma hora, um par disjunto vazio, uma faixa A invertida e um payload completamente ausente para que as ligações de interface sejam honestas.
Determinismo, limites e integração
A implementação é lógica pura de motor parse sem rede, relógio ou aleatoriedade além dos carimbos que você fornece, de modo que entradas idênticas produzem sempre saídas idênticas. Carimbos extremamente distantes seguem sujeitos à precisão de milissegundos IEEE do tipo Date da plataforma; documente esse contrato ao armazenar resultados. Revise o esquema publicado antes de ligar métricas e associe apenas as chaves de sucesso documentadas empty, start, end, duration_ms e duration_hours.
Perguntas técnicas
E se a entrada for inválida?
Você recebe invalid_input com mensagem clara em inglês.
Quem é o autor?
Aspire no ateliê KIT da ForHosting.