Différence de dates et calcul d'âge
Beaucoup cherchent le nombre de jours entre deux dates et un âge fiable en années, mois et jours.
Lancer gratuitement
Cet outil répond aux deux questions avec les seules règles du calendrier civil : sans fuseaux horaires, sans jours ouvrés et sans arrondis cachés. Vous obtenez les jours totaux, une décomposition signée années-mois-jours et la paire ordonnée utilisée pour le calcul.
Dates civiles uniquement — sans horloge ni fuseau
Chaque entrée est un jour de calendrier au format AAAA-MM-JJ. Le calcul ne consulte ni les heures, ni le passage à l'heure d'été, ni l'horloge du serveur pour la différence elle-même. Ainsi, la même paire de dates reste stable dans l'outil gratuit du navigateur et dans l'API. Les jours invalides comme 2023-02-29 ou 2024-04-31 sont rejetés plutôt qu'ajustés en silence, afin qu'une faute de saisie ne devienne pas un anniversaire erroné.
Années, mois et jours avec une règle cohérente de fin de mois
La décomposition utilise des mois calendaires avec plafonnement au dernier jour valide : ajouter un mois à 2024-01-31 donne 2024-02-29, non un jour inventé de mars. Si un mois provisoire dépasse la date de fin, l'algorithme recule d'un mois et compte les jours entiers restants. C'est pourquoi du 2024-01-31 au 2024-02-29 il y a un mois et zéro jour, et du 2024-01-31 au 2024-02-28 zéro mois et vingt-huit jours. Les jours totaux excluent le jour de départ : la même date donne zéro.
Mode différence et mode âge partagent le même oracle
Le mode différence compare date_from et date_to et renvoie total_days, years, months, days, sign et la paire ordonnée. Le mode âge utilise birthdate et une reference_date explicite pour des résultats déterministes ; si vous omettez la référence dans l'outil gratuit, la date civile locale de l'appareil est utilisée. Numériquement, l'âge est la même fonction que la différence avec d'autres noms de champs, de sorte qu'un âge à référence fixe ne peut diverger de la différence de cette même paire.
Résultats signés lorsque l'ordre est inversé
Si la date de fin précède la date de début, l'outil n'échange pas silencieusement les entrées. Il conserve l'ordre soumis dans les champs d'écho et applique un signe négatif aux jours totaux et à la décomposition. Cette symétrie couvre les anniversaires futurs, les intervalles inversés et les contrôles automatiques qui doivent détecter un intervalle à l'envers sans un second chemin de code.
Cas d’usage
Jours entre deux jalons de projet
Mesurez les jours calendaires exclusifs entre le lancement et l'échéance sans y mêler week-ends, jours fériés ni fuseaux horaires.
Âge civil pour formulaires et éligibilité
Calculez années, mois et jours par rapport à une date de référence fixe afin que revues et exports restent reproductibles.
Anniversaires et cas limites du 29 février
Traitez les naissances au 29 février et les paires de fin de mois avec la même règle de plafonnement que pour les mois ordinaires.
Contrôles automatiques d'intervalles
Appelez l'API dans un pipeline et enregistrez total_days avec la décomposition signée pour l'audit.
Questions fréquentes
Le décompte des jours est-il inclusif ou exclusif ?
Exclusif du jour de départ. La même date donne zéro jour total ; le jour civil suivant en donne un.
Comment la fin de mois est-elle traitée ?
Les mois sont ajoutés avec plafonnement au dernier jour valide du mois cible, puis corrigés si la date intermédiaire dépasse la date de fin. Les jours entiers restants complètent la décomposition.
Que se passe-t-il pour le 29 février hors année bissextile ?
L'anniversaire du 2024-02-29 au 2025-02-28 vaut un an, zéro mois et zéro jour selon la règle de plafonnement. Les entrées invalides comme 2023-02-29 sont rejetées.
En quoi cela diffère-t-il des jours ouvrés ?
Cette capacité compte la différence naturelle de calendrier et l'âge civil. Les jours ouvrés et fériés relèvent d'un autre outil et ne s'appliquent pas ici.
Le résultat peut-il être négatif ?
Oui. Lorsque la date de fin précède la date de début, total_days et les champs années-mois-jours portent un signe négatif sans échanger les valeurs soumises.
Le calculateur est-il gratuit sur ordinateur et mobile ?
La page s'exécute localement et gratuitement dans les navigateurs de bureau et mobiles. L'application native appelle l'API et affiche le tarif ; la même requête coûte $0.002 avec le solde prépayé KIT.
Pour les développeurs — accès API
Tout sur cette page est disponible par programmation. Cette section s'adresse aux équipes qui veulent l'intégrer à leurs systèmes ; les autres peuvent simplement utiliser l'outil ci-dessus.
Endpoint
Authentification par jeton Bearer : un seul POST met la tâche en file d’attente, et le résultat vous parvient par webhook ou lien signé.
Appeler depuis votre stack
curl -X POST https://api.kit.forhosting.com/dev/date-diff \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"date_from":"2024-01-31","date_to":"2024-02-29"}'const res = await fetch("https://api.kit.forhosting.com/dev/date-diff", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"date_from": "2024-01-31",
"date_to": "2024-02-29"
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/dev/date-diff",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"date_from": "2024-01-31",
"date_to": "2024-02-29"
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/dev/date-diff", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"date_from":"2024-01-31","date_to":"2024-02-29"}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"date_from":"2024-01-31","date_to":"2024-02-29"}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/dev/date-diff", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Exemple de requête
{
"date_from": "2024-01-31",
"date_to": "2024-02-29"
}Exemple de réponse
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "dev.date_diff",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}L’API est asynchrone : chaque appel renvoie un task_id immédiatement, puis vous interrogez l’état à raison d’une requête par seconde.
Tarifs
Le prix est publié, sans tokens ni crédits. Une tâche qui échoue n’est pas facturée.
Limites
year_min | 1 |
year_max | 9999 |
Erreurs
| HTTP | Code | Signification |
|---|---|---|
401 | unauthorized | Clé API absente ou invalide : vérifiez l’en-tête Authorization. |
402 | insufficient_balance | Solde insuffisant : rechargez votre compte pour lancer cette tâche. |
404 | unknown_type | Type de tâche inconnu : vérifiez le champ type de votre requête. |
429 | rate_limited | Trop de requêtes : ralentissez la cadence, puis réessayez. |