Diferença entre datas em anos, meses e dias
Esta calculadora divide o intervalo entre duas datas ISO explícitas em anos completos, meses completos e dias restantes.
Executar grátis
Ela também informa a direção e o total de dias com sinal. Como você fornece ambas as datas, o resultado nunca depende da hora atual. A validação rígida AAAA-MM-DD, as regras do calendário gregoriano proléptico e a aritmética sem fuso horário tornam a mesma solicitação reproduzível no navegador, na API ou em testes automatizados.
Como o detalhamento em anos, meses e dias é calculado
A calculadora trata o intervalo como uma duração de calendário, não como uma conversão decimal de dias. A partir da data anterior, encontra a maior quantidade de meses completos que pode ser somada sem ultrapassar a posterior. Depois separa esse total em anos e meses e conta os dias exatos desde o aniversário intermediário. Assim, trinta dias nem sempre formam um mês: o próximo aniversário mensal precisa ter chegado. O método preserva o sentido comum de anos e meses apesar de seus comprimentos diferentes. total_days fornece separadamente a diferença ordinal com sinal. Use esse campo quando precisar de um único número e o detalhamento para uma duração legível. Ao inverter as datas, os componentes continuam não negativos; direction e total_days preservam a ordem informada.
Fins de mês, anos bissextos, datas invertidas e UTC
Nem todo dia existe em todos os meses, portanto há regras explícitas. Quando um passo mensal chega a um mês mais curto, o dia é limitado ao último válido: 31 de janeiro avança para 28 ou 29 de fevereiro. Em seguida, o algoritmo verifica se houve ultrapassagem. Anos bissextos seguem a regra gregoriana: divisíveis por 4, exceto séculos que não sejam divisíveis por 400. Se a segunda data for anterior, o detalhamento mantém a magnitude, direction indica retrocesso e total_days fica negativo. Datas iguais retornam zeros. Todo o cálculo usa campos inteiros, sem Date do JavaScript, fuso local, horário de verão, rede, relógio ou interpretação dependente de localidade.
Como informar as datas e interpretar a resposta
Forneça from e to como textos AAAA-MM-DD, incluindo zeros à esquerda. São aceitos anos de 0001 a 9999. Datas impossíveis, campos ausentes, timestamps, formatos regionais e frases naturais são rejeitados em vez de adivinhados. years, months e days descrevem juntos uma duração sequencial desde a data cronologicamente anterior. Não converta meses isoladamente em uma quantidade fixa de dias. total_days é adequado para ordenação, prazos e armazenamento escalar; direction indica avanço, retrocesso ou igualdade. Entre os usos estão tempo de conta, duração de projetos, comparação histórica e regras contratuais reproduzíveis. Uma solicitação à API custa US$ 0,002. Para calcular idade em um dia específico, informe e armazene essa referência; a ferramenta nunca substitui a data por hoje.
Casos de uso
Descrever a duração de um projeto
Transforme dois marcos registrados em uma duração legível, mantendo também a contagem exata e assinada de dias.
Calcular tempo de vínculo em data fixa
Meça associação, emprego ou existência de conta contra uma referência armazenada, não contra o dia atual variável.
Criar testes de datas reproduzíveis
Valide fins de mês e anos bissextos com resultados independentes do fuso horário e do momento da execução.
Perguntas frequentes
A calculadora usa a data de hoje?
Não. As duas datas ISO são obrigatórias e o cálculo nunca consulta o relógio atual.
Datas em ordem inversa são permitidas?
Sim. O detalhamento permanece não negativo, direction indica retrocesso e total_days fica negativo.
Como são tratados os fins de mês?
O passo mensal é limitado ao último dia válido de um mês mais curto e depois verificado para evitar ultrapassagem.
Qual formato de data é aceito?
Use textos rígidos AAAA-MM-DD com datas gregorianas válidas e anos entre 0001 e 9999.
Fusos horários ou horário de verão alteram o resultado?
Não. A implementação usa aritmética inteira de datas, sem Date do JavaScript, fuso local ou regras de horário de verão.
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/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)Exemplo de requisição
{
"from": "2019-01-31",
"to": "2024-03-02"
}Exemplo de resposta
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "date.diff_breakdown_ymd",
"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. |