Méthode simple si vous avec deux dates simples :
Le code ci-dessous est une version rapide et simplifiée de cet article.
$nombre_de_jours = (strtotime("2025-09-27") - strtotime("2025-09-30")) / 86400;
// strtotime("date") transforme une date en secondes (timestamp)
// On soustrait les deux dates pour avoir la différence en secondes
// Puis on divise par 86400 (= nb de secondes dans 1 jour) pour avoir la différence en jours
/*
* A noter qu'il vous faudra configurer le timezone pour afficher la bonne différence, à la minute prés
* Le timezone pour la France:
* date_default_timezone_set("europe/paris");
* A utiliser en haut du document
*/
function differenceDate($UneDate,$UneAutre=false){
//on part du principe que $UneDate et $UneAutre peut être envoyé sous deux formats: un timestamp ou une date formatée
//on vérifie donc le format envoyé, pour le mettre en date formatée si c'est un timestamp:
//is_numeric vérifie si c'est un nombre entier (un timestamp est un nombre entier)
$UneDate = is_numeric($UneDate)?date("d-m-Y H:i:s",$UneDate):$UneDate;
//on crée ensuite la date via date_create (Retourne un nouvel objet DateTime (DateTime: Représentation d'une date et heure))
$UneDate = date_create($UneDate);
$maintenant = date_create($UneAutre==false?'now':(is_numeric($UneAutre)?date("d-m-Y H:i:s",$UneAutre):$UneAutre));
//si jamais la date formatée qui à été envoyée est incorrect, on retourne un message d'erreur
if(!$UneDate){
echo "La date envoyée à differenceDate() est incorrecte.";
return;
}
//date_diff nous donne maintenant des valeurs sur les représentations ci-dessus
$interval = date_diff($maintenant, $UneDate);
//on récupère les valeurs d'$interval qui nous intéresse
$y=$interval->y;//années
$m=$interval->m;//mois
$d=$interval->d;//jours
$h=$interval->h;//heures
$i=$interval->i;//minutes
$s=$interval->s;//secondes
$invert=$interval->invert;//0 = $UneDate est dans le futur, 1 = $UneDate est dans la passé
$texte_invert=$invert==($UneAutre==false?1:0)?'Il y a':'Dans';//il y a une différence lorsqu'on demande un interval ou si on demande "depuis $UneDate seulement":
//depuis $UneDate seulement: 1 = $UneDate est dans le futur, 0 = $UneDate est dans la passé
//interval entre $UneDate et $UneAutre: 0 = $UneDate est dans le futur, 1 = $UneDate est dans la passé
$days=$interval->days;//nombre de jours écoulés (depuis combien ou dans combien, nombre entier positif)
//enfin, on retourne les différences pour les afficher:
//si il y a plus d'un an, on affiche le nombre d'année plus le nombre de jours ("5 ans et 18 jours" par exemple)
if($y>0) $texte="$texte_invert $y an".($y>1?'s':'').($d>0?" et ".$d." jour".($d>1?'s':''):'');
//si il y a moins d'un an, on affiche les mois et les jours ("5 mois et 24 jours" par exemple)
elseif($m>0) $texte="$texte_invert $m mois".($d>0?" et $d jour".($d>1?'s':'') : "");
//si il y a moins d'un mois, on affiche les jours, évidemment
elseif($d>0) $texte="$texte_invert $d jour".($d>1?'s':'');
//les heures si il y a moins d'un jour
elseif($h>0) $texte="$texte_invert $h heure".($h>1?'s':'');
//les minutes si il y a moins d'une heure
elseif($i>0) $texte="$texte_invert $i minute".($i>1?'s':'');
// et les secondes si il y a moins d'une minute
elseif($s>0) $texte="$texte_invert $s seconde".($s>1?'s':'');
//si toutes les précédentes valeurs précédentes sont à 0, c'est forcément que c'est maintenant/aujourd'hui (s'affiche seulement si les heures et minutes ne sont pas précisées)
else $texte="C'est aujourd'hui!";
//on retourne un tableau, au moins on pourra afficher la ou les valeurs voulues
return [
'texte'=>$texte,//notre texte formaté du genre "Il y a 5 heures" ou "Dans 1 mois et 12 jours", par exemple
'y'=>$y,
'm'=>$m,
'd'=>$d,
'h'=>$h,
'i'=>$i,
's'=>$s,
'invert'=>$invert,
'texte_invert'=>$texte_invert,
'days'=>$days,
];
}
//utilisation pour afficher la date indiquée jusqu'à maintenant:
$differenceDate = differenceDate("8-5-2120 10:00");
//on peut afficher n'importe quelle valeurs:
//on affiche le texte:
echo "<p>{$differenceDate['texte']}</p>";
//l'utilisation d'accolade dans un echo est possible grâce aux guillemets doubles, pas possible avec les simples guillemets, vous devez utiliser la concaténation suivante: '.$differenceDate['texte'].'
//on affiche le nombre de jours écoulé (ou le nombre de jours qu'il reste à passer):
//utilisation pour un compte à rebours:
if($differenceDate['invert']==0)
echo "<p>Disponible dans {$differenceDate['y']} an(s), {$differenceDate['m']} mois, {$differenceDate['d']} jour(s), {$differenceDate['h']} heure(s), {$differenceDate['i']} minute(s), {$differenceDate['s']} seconde(s)</p>";
else
echo "<p>La date est passé depuis {$differenceDate['days']} jour(s)!</p>";
//l'utilisation de if/else sans accolade est possible si vous mettez qu'une seule chose après if ou else, ici on a une chose (echo)
$differenceDate = differenceDate("1-4-2020 10:00","1-4-2120 10:00");
echo "<p>{$differenceDate['texte']}</p>";
$differenceDate = differenceDate(1588778845,1789889845);
echo "<p>{$differenceDate['texte']}</p>";
$differenceDate = differenceDate("1-4-2120 10:00",1789889845);
echo "<p>{$differenceDate['texte']}</p>";
$differenceDate = differenceDate(1588778845,"1-4-2120 10:00");
echo "<p>{$differenceDate['texte']}</p>";A noter qu'on peut également s'en servir en compte à rebours PHP, si la date est dans le futur. (sera statique mais couplé à du JS on peut faire bouger la date une fois la page chargée)J'espère que ce script gratuit vous est utile.Pour soutenir mon travail, un simple don ou mettre une note est grandement apprécié.
Vous cherchez à pousser encore plus loin vos idées ou à les concrétiser avec un site internet sur mesure ? Je suis là pour vous aider ! Mon expérience en développement web est à votre disposition.
Que ce soit la création de votre site web pro ou l'apport de fonctionnalités avancées à votre projet, contactez-moi pour en discuter et avoir un devis gratuit personnalisé.
Mon objectif est de vous offrir des solutions sur mesure qui répondent à vos besoins, et votre vision associée à mon expertise donnera vie à votre projet web parfait. Contactez-moi aujourd'hui, je réponds en général en moins d'une heure :
Demander un devislordbdp le 10 Mai 2020 à 00:59
Aurais-tu le code afin d'afficher l'âge d'un membre à partir de sa date de naissance (sur sgdb) ?
Merci pour tes codes ;)
admin le 10 Mai 2020 à 11:01
Voir la fonction AGE() (PostgreSQL)
Il y a un sujet ici: Calcul de l'age d'une personne - Développement SQL Server