Différence entre les dates en PHP : du débutant au pro

Formateur Python en ligne pour débutants

Apprenez Python facilement sans surcharge théorique. Résolvez des tâches pratiques avec vérification automatique et écrivez du code directement dans le navigateur.

Start Course

Comment calculer la différence entre deux dates en PHP : guide complet avec exemples

\n\n

Avez-vous déjà été confronté à la question : « combien de jours se sont écoulés depuis l'inscription de l'utilisateur ? », « quel âge a une personne selon sa date de naissance ? » ou « dans combien d'heures l'offre promotionnelle se termine-t-elle ? » ? Si oui, vous vous êtes sûrement demandé : comment calculer la différence entre deux dates en PHP ? C'est l'une des questions les plus populaires sur Stack Overflow, et pour cause : travailler avec les dates est un sujet fondamental mais délicat.

\n\n

Dans cet article, nous allons examiner trois approches principales : la classique strtotime(), la moderne orientée objet DateTime et le puissant package tiers Carbon. Vous apprendrez non seulement « comment faire », mais aussi quelle méthode choisir pour votre tâche. C'est parti !

\n\n

Pourquoi une simple soustraction de dates est une mauvaise idée ?

\n\n

Les développeurs débutants essaient souvent de faire ceci :

\n\n
<?php\n$date1 = '2024-01-15';\n$date2 = '2024-01-10';\n$diff = $date2 - $date1; // Erreur ! Impossible de soustraire des chaînes\n?>\n
\n\n

PHP ne sait pas soustraire des chaînes, même si elles ressemblent à des dates. Le résultat sera 0 ou un avertissement. Même si vous utilisez strtotime() et obtenez des timestamps Unix, une simple soustraction de secondes vous donnera uniquement le nombre de secondes, et non un format pratique comme « 2 jours 3 heures 15 minutes ». Pour cela, des outils spéciaux sont nécessaires.

\n\n

Approche 1 : La classique — strtotime() et calculs manuels

\n\n

Cette méthode est connue de tous ceux qui ont commencé avec PHP 4 ou 5. La fonction strtotime() convertit une représentation textuelle d'une date en timestamp Unix (nombre de secondes depuis le 1er janvier 1970). Ensuite, nous soustrayons les timestamps et divisons par le nombre de secondes dans une journée.

\n\n

Exemple : différence en jours

\n\n
<?php\n$date1 = strtotime('2024-12-25');\n$date2 = strtotime('2024-12-20');\n\n$seconds_diff = $date1 - $date2;\n$days_diff = floor($seconds_diff / (60 * 60 * 24));\n\necho "Différence : $days_diff jours"; // Affiche : Différence : 5 jours\n?>\n
\n\n

Avantages : simplicité, pas besoin d'objets, fonctionne rapidement.

\n\n

Inconvénients :
\n- Pas de support des fuseaux horaires (toujours UTC).
\n- Lors du passage à l'heure d'été/hiver, une erreur d'une heure est possible (et donc d'un jour si le changement tombe sur votre intervalle).
\n- Pour obtenir une différence en mois ou en années, il faut écrire une logique complexe tenant compte des années bissextiles.

\n\n

Quand l'utiliser : uniquement pour des calculs approximatifs (par exemple, « plus de 30 jours se sont écoulés ? ») ou si vous avez une ancienne base de code.

\n\n

Approche 2 : DateTime et DateInterval — le standard PHP moderne

\n\n

Depuis PHP 5.2, le langage dispose de la puissante classe DateTime. Associée à DateInterval, elle résout 95% des tâches liées aux dates. C'est la méthode recommandée pour calculer la différence entre deux dates en PHP.

\n\n

Exemple de base : différence en jours, mois et années

\n\n
<?php\n$date1 = new DateTime('2024-01-15');\n$date2 = new DateTime('2023-11-10');\n$interval = $date1->diff($date2);\n\necho $interval->format('%y années, %m mois, %d jours');\n// Affiche : 0 années, 2 mois, 5 jours\n?>\n
\n\n

La magie réside dans le fait que diff() prend automatiquement en compte les années bissextiles, les différents nombres de jours dans les mois et même les fuseaux horaires (s'ils sont définis).

\n\n

Accéder aux composants individuels

\n\n
<?php\n$date1 = new DateTime('2024-12-25');\n$date2 = new DateTime('2024-01-01');\n$interval = $date1->diff($date2);\n\necho "Années : " . $interval->y . "<br>";\necho "Mois : " . $interval->m . "<br>";\necho "Jours : " . $interval->d . "<br>";\necho "Total jours : " . $interval->days . "<br>";\n// Affiche :\n// Années : 0\n// Mois : 11\n// Jours : 24\n// Total jours : 359\n?>\n
\n\n

Notez la propriété days — il s'agit du nombre total de jours dans l'intervalle (contrairement à d qui affiche

Blogs

Book Recommendations