Comment calculer la différence entre deux dates en PHP : du débutant au pro
\n\nVous êtes-vous déjà demandé : « Combien de jours se sont écoulés depuis mes dernières vacances ? » ou « Dans combien d'heures se termine la promotion sur le site ? » ? Si vous êtes développeur PHP, ces questions se transforment en un seul problème : comment calculer la différence entre deux dates.
\n\nCette question est l'une des plus populaires sur Stack Overflow avec des milliers de vues. Et ce n'est pas sans raison : travailler avec les dates en PHP peut être délicat. Années bissextiles, fuseaux horaires, formats différents – tout cela peut casser même le code le plus réfléchi.
\n\nDans cet article, nous allons examiner 5 méthodes éprouvées pour calculer la différence entre les dates en PHP – des plus simples aux plus professionnelles. Vous apprendrez quand utiliser quelle méthode et obtiendrez des exemples de code prêts à l'emploi.
\n\n1. Méthode classique : strtotime() et arithmétique simple
\n\nLa méthode la plus ancienne et intuitive consiste à convertir les dates en timestamps Unix avec la fonction strtotime() et à simplement soustraire un nombre de l'autre.
<?php\n$date1 = strtotime('2024-01-15');\n$date2 = strtotime('2024-03-20');\n\n$diff_seconds = $date2 - $date1;\n$diff_days = floor($diff_seconds / (60 * 60 * 24));\n\necho "Différence en jours : " . $diff_days; // Affiche : 65\n?>\n\nAvantages : simplicité, fonctionne dans toutes les versions de PHP.
\nInconvénients : ne tient pas compte des fuseaux horaires, problèmes avec les dates antérieures à 1970, pas de support intégré pour les mois et les années (car leur durée varie).
\n\nCette méthode convient pour des calculs rapides « à la volée », mais pour des projets sérieux, il est préférable d'utiliser des outils plus modernes.
\n\n2. Standard moderne : la classe DateTime et la méthode diff()
\n\nDepuis PHP 5.2, nous disposons de la puissante classe DateTime. C'est un véritable couteau suisse pour travailler avec les dates. La méthode diff() retourne un objet DateInterval qui contient toutes les informations sur la différence.
<?php\n$date1 = new DateTime('2024-01-15');\n$date2 = new DateTime('2024-03-20');\n\n$interval = $date1->diff($date2);\n\necho "Différence : " . $interval->days . " jours"; // 65\necho "ou " . $interval->m . " mois et " . $interval->d . " jours"; // 2 mois et 5 jours\n?>\n\nDateInterval donne accès aux propriétés suivantes :
\n- \n
y— années \n m— mois \n d— jours \n h— heures \n i— minutes \n s— secondes \n days— nombre total de jours (le plus utile !) \n invert— indicateur : 0 si la première date est antérieure, 1 si elle est postérieure \n
Cette méthode prend en compte les années bissextiles et fonctionne correctement avec les différentes particularités calendaires. C'est celle recommandée dans la documentation officielle de PHP.
\n\n3. Formatage de la différence : comment afficher « 2 ans 3 mois 10 jours »
\n\nSouvent, il ne suffit pas d'obtenir un nombre, il faut formater joliment la différence pour l'utilisateur. La méthode format() de l'objet DateInterval vient à la rescousse.
<?php\n$birthday = new DateTime('1990-05-15');\n$today = new DateTime();\n\n$age = $birthday->diff($today);\n\necho $age->format('%y ans %m mois %d jours');\n// Exemple : 34 ans 2 mois 3 jours\n?>\n\nSpécificateurs de format :
\n- \n
%y— années \n %m— mois \n %d— jours \n %h— heures \n %i— minutes \n %s— secondes \n %a— nombre total de jours (alternative àdays) \n %r— signe "moins" si la différence est négative \n
Vous voulez la déclinaison des mots « jour/jours » ? Il faudra écrire votre propre log