Calculadora de tiempo superpuesto entre dos intervalos
Esta calculadora mide exactamente cuánto tiempo comparten dos intervalos de fecha y hora explícitos.
Ejecutar — gratis
Introduzca el inicio y el final de cada intervalo en formato ISO 8601, con Z o un desplazamiento UTC numérico. El cálculo sitúa todos los límites en una misma línea temporal UTC, selecciona el inicio posterior y el final anterior, y devuelve la duración común en milisegundos, segundos, minutos y horas. Los intervalos separados o que solo se tocan producen cero, lo que facilita su uso en horarios, facturación, supervisión e informes.
Defina ambos intervalos con límites inequívocos
Introduzca cuatro valores: el inicio y el final del primer intervalo, seguidos del inicio y el final del segundo. Cada valor debe ser una fecha y hora ISO 8601 completa, con fecha de calendario, hora con segundos y Z o un desplazamiento explícito como +02:00 o -05:30. Exigir el desplazamiento impide que otro equipo interprete de forma distinta una hora local. Cada inicio debe ser anterior a su final. La calculadora trata los intervalos como rangos semiabiertos: incluye el inicio y usa el final como límite excluido. Así no se cuenta dos veces el mismo instante cuando se unen reservas, turnos o ventanas consecutivas. Admite de una a tres cifras decimales para los segundos y las normaliza a milisegundos. Valida directamente fechas y horas, por lo que valores imposibles generan un error de entrada. Use siempre los mismos cuatro campos, tanto si espera una coincidencia como si no.
Comprenda el cálculo determinista en UTC
Antes de comparar, el cálculo coloca los cuatro límites en una única línea temporal UTC. Un valor terminado en Z ya está en UTC. A uno con desplazamiento positivo se le resta dicho desplazamiento, mientras que a uno negativo se le suma. Por eso dos fechas escritas de forma diferente pueden representar el mismo instante. La superposición comienza en el más tardío de los dos inicios y termina en el más temprano de los dos finales. Si ese final es posterior al inicio calculado, la diferencia es la duración común; en caso contrario, el resultado es exactamente cero. La implementación usa aritmética del calendario gregoriano y milisegundos enteros, sin consultar reloj, configuración regional, base de zonas horarias, red, datos aleatorios ni Date de JavaScript. Las mismas entradas siempre producen el mismo resultado. La salida expresa una sola duración en milisegundos, segundos, minutos y horas para que usted elija la unidad adecuada.
Aplique el resultado con seguridad
Use esta duración cuando necesite comparar dos ventanas conocidas: un turno con una ausencia aprobada, el funcionamiento de un equipo con una franja tarifaria, una incidencia con el horario de servicio o una reserva con un bloque disponible. Un valor positivo indica cuánto tiempo comparten, no solo que existe una intersección. Cero significa que están separados o que uno termina justo cuando empieza el otro; en ambos casos no hay tiempo transcurrido común según la convención semiabierta. Para importes o cuotas, tome overlap_milliseconds u overlap_seconds como valor fuente y aplique después su propia regla de redondeo documentada. No redondee antes los límites salvo que su política lo exija. El servicio solo procesa desplazamientos explícitos, no nombres como America/New_York ni reglas de horario estacional. Convierta previamente las horas locales. Cada solicitud API cuesta $0.002; la versión del navegador permite comprobaciones interactivas locales.
Qué puede hacer con ella
Medir la cobertura de turnos
Calcule qué parte de un turno coincide con una ventana operativa atendida, remunerada o autorizada.
Asignar tiempo de incidencias
Mida la parte de una interrupción ocurrida dentro de un periodo contractual de soporte o servicio.
Comprobar conflictos de reservas
Cuantifique el tiempo común entre dos reservas en lugar de obtener únicamente una respuesta afirmativa o negativa.
Preguntas frecuentes
¿Qué ocurre si los intervalos no se superponen?
Los cuatro campos de duración devuelven cero. También sucede cuando uno termina exactamente al comenzar el otro.
¿Admite desplazamientos UTC distintos?
Sí. Cada límite puede usar Z o su propio desplazamiento numérico, y todos se comparan en una línea temporal UTC común.
¿Se incluyen los extremos del intervalo?
Se usan intervalos semiabiertos: el inicio está incluido y el final excluido. Por ello, intervalos adyacentes comparten cero tiempo.
¿El cálculo utiliza la zona horaria del servidor?
No. Emplea aritmética gregoriana y de desplazamientos sin Date, base de zonas, reloj del equipo ni configuración regional.
¿Cuánto cuesta una solicitud API?
El precio es $0.002 por solicitud. La ejecución interactiva en el navegador no genera un cargo API.
Para desarrolladores — acceso por API
Todo lo de esta página está disponible por programación. Esta sección es para equipos que quieren integrarlo en sus sistemas; el resto puede usar la herramienta de arriba sin más.
Endpoint de API
¿Prefiere automatizarlo? Un POST autenticado crea la tarea; el resultado llega por webhook o enlace firmado. La misma capacidad también se ejecuta aquí en la web, por email y desde Telegram — y pronto también desde nuestra app.
Llámela desde su stack
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)Ejemplo de solicitud
{
"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"
}Ejemplo de respuesta
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "date.overlap_duration",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}La API es asíncrona: la llamada devuelve un task_id al instante y el resultado llega por webhook. El polling está limitado a 1 req/s por tarea.
Precio
Precio publicado — sin tokens ni créditos inventados. Una tarea fallida no se cobra.
Errores
| HTTP | Código | Significado |
|---|---|---|
401 | unauthorized | API key ausente o inválida. |
402 | insufficient_balance | El saldo no cubre el precio de la tarea. |
404 | unknown_type | El tipo de tarea no existe. |
429 | rate_limited | Demasiadas peticiones. Use el webhook en vez de sondear. |