Diferencia entre fechas en años, meses y días
Esta calculadora desglosa la distancia entre dos fechas ISO explícitas en años completos, meses completos y días restantes.
Ejecutar — gratis
También indica la dirección y el total de días con signo. Como usted proporciona ambas fechas, el resultado nunca depende de la hora actual. La validación estricta AAAA-MM-DD, el calendario gregoriano proléptico y una aritmética independiente de la zona horaria permiten reproducir la misma solicitud en el navegador, el API o una prueba automática.
Cómo se calcula el desglose en años, meses y días
La calculadora interpreta el intervalo como duración de calendario, no como conversión decimal de días. Desde la fecha anterior busca el mayor número de meses completos que puede sumar sin rebasar la posterior. Separa ese número en años y meses, y calcula los días exactos desde el aniversario intermedio. Por eso, treinta días no siempre constituyen un mes: debe haberse alcanzado el siguiente aniversario mensual. Este método conserva el significado habitual de años y meses aunque su longitud varíe. total_days ofrece por separado la diferencia ordinal con signo. Use ese campo si necesita un único recuento y el desglose cuando necesite una duración legible. Los componentes permanecen no negativos al invertir las fechas; direction y total_days conservan el orden de entrada.
Finales de mes, años bisiestos, orden inverso y UTC
No todos los días existen en todos los meses, por lo que se aplican reglas explícitas. Si un paso mensual llega a un mes más corto, el día se ajusta al último válido: desde el 31 de enero se llega al 28 o 29 de febrero. Después se comprueba que el resultado no rebase la fecha final. Los bisiestos siguen la regla gregoriana: divisibilidad por 4, salvo siglos no divisibles por 400. Si la segunda fecha es anterior, el desglose mantiene la misma magnitud, direction indica retroceso y total_days es negativo. Fechas iguales producen ceros. La operación usa enteros de fecha, sin Date de JavaScript, husos horarios, horario de verano, red, reloj ni análisis dependiente de la configuración regional.
Cómo introducir fechas y usar correctamente el resultado
Indique from y to como cadenas AAAA-MM-DD, con ceros iniciales. Se admiten años de 0001 a 9999. Se rechazan fechas imposibles, campos ausentes, marcas de tiempo, formatos regionales y expresiones en lenguaje natural, sin intentar adivinarlas. years, months y days forman una duración secuencial desde la fecha cronológicamente anterior. Léalos juntos y no convierta los meses a una cantidad fija de días. total_days sirve para ordenar, controlar plazos o almacenar un valor escalar; direction señala avance, retroceso o igualdad. Puede usar el cálculo para antigüedad, hitos de proyectos, fechas históricas y reglas contractuales reproducibles. Cada solicitud del API cuesta $0.002. Si necesita una edad a una fecha concreta, proporcione y conserve esa fecha de referencia: la herramienta nunca sustituye por hoy.
Qué puede hacer con ella
Describir la duración de un proyecto
Convierta dos hitos registrados en una duración legible y conserve además el recuento exacto de días con signo.
Calcular antigüedad en una fecha fija
Mida afiliación, empleo o vida de una cuenta contra una referencia guardada, no contra el día actual cambiante.
Crear pruebas de fechas reproducibles
Compruebe finales de mes y años bisiestos con resultados que no varían por zona horaria ni momento de ejecución.
Preguntas frecuentes
¿La calculadora utiliza la fecha de hoy?
No. Ambas fechas ISO son obligatorias y el cálculo nunca consulta el reloj actual.
¿Se permiten fechas en orden inverso?
Sí. El desglose sigue siendo no negativo, direction indica retroceso y total_days pasa a ser negativo.
¿Cómo se tratan los finales de mes?
Cada paso mensual se ajusta al último día válido de un mes más corto y después se comprueba que no haya rebasamiento.
¿Qué formato de fecha se acepta?
Use cadenas estrictas AAAA-MM-DD con fechas gregorianas válidas y años entre 0001 y 9999.
¿Influyen los husos horarios o el horario de verano?
No. Se usa aritmética entera de fechas, sin Date de JavaScript, zona local ni reglas de horario de verano.
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/diff-breakdown-ymd \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"from":"2019-01-31","to":"2024-03-02"}'const res = await fetch("https://api.kit.forhosting.com/date/diff-breakdown-ymd", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"from": "2019-01-31",
"to": "2024-03-02"
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/date/diff-breakdown-ymd",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"from": "2019-01-31",
"to": "2024-03-02"
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/date/diff-breakdown-ymd", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"from":"2019-01-31","to":"2024-03-02"}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"from":"2019-01-31","to":"2024-03-02"}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/date/diff-breakdown-ymd", 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
{
"from": "2019-01-31",
"to": "2024-03-02"
}Ejemplo de respuesta
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "date.diff_breakdown_ymd",
"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. |