$
!
[
@
>
*
<
}

NOUS LES DEVS

Nombre de jours entre deux dates

Obtenir l'intervalle de jours entre maintenant et une date précise en PHP

Niveau : débutant(e)
</> </> </>

Abonnement et échéance

Il y a quelque temps, j’ai dû créer un système de notification qui averti les clients dont l’abonnement (Woocommerce) arrive à expiration prochainement. J’avais deux informations en ma possession, la date de fin de l’abonnement et la date d’aujourd’hui (date à laquelle tourne le cron, puisqu’il s’agissait d’une tâche automatisée).

Timestamp

J’ai immédiatement pensé à convertir les deux dates en timestamp, faire une soustraction afin d’obtenir le nombre de secondes entre les deux dates et enfin, diviser par 86400 (nombre de secondes dans une journée). Initialement, j’avais quelque chose de ce genre.

<?php

	// date de fin de l'abonnement
	$subscription_expiration_date = new DateTime("2020-09-09 00:00:00");
	
	// maintenant (au moment où le script est exécuté)
	$now_date = new DateTime("now");

	// différence des deux timestamps
	$diff = $subscription_expiration_date->getTimestamp() - $now_date->getTimestamp();

	// calcul du nombre de jours et arrondi inférieur
	$diff_in_day = floor($diff / 86400);

	// affichage
	echo $diff_in_day;

?>

Diff

Quelques jours plus tard, la demande a évolué et j’ai dû changer le contenu de certains emails en adaptant le texte afin d’avoir une information sous la forme « Ton abonnement expire dans X mois et Y jours », il fallait donc faire des changements dans le code. Je me suis demandé s’il n’y avait pas quelque chose de tout fait pour avoir les données complètes sur l’écart entre deux dates. En cherchant dans la documentation, je suis tombé sur la méthode diff de la class DateTime qui fait exactement ce que je cherche, c’est-à-dire donner l’intervalle entre deux dates avec des informations sur les jours, mois, années, etc.

Si je reprend l’exemple du dessus, voici mes deux dates (la fonction pre() dans le code est du code custom et permet d’afficher un tableau).

<?php 

	$subscription_expiration_date = new DateTime("2020-09-09 00:00:00");
	$now_date = new DateTime("now");

	pre($subscription_expiration_date);
	pre($now_date);

?>
DateTime Object
(
    [date] => 2020-09-09 00:00:00.000000
    [timezone_type] => 3
    [timezone] => UTC
)

DateTime Object
(
    [date] => 2020-06-13 09:21:00.481942
    [timezone_type] => 3
    [timezone] => UTC
)

Je me sers maintenant de la méthode diff sur l’objet $now_date et en paramètre je passe l’autre objet $subscription_expiration_date.

<?php

	// appel de la méthode diff
	$interval = $now_date->diff($subscription_expiration_date);

	// affichage
	pre($interval);

?>

Le résultat est un objet DateInterval qui contient les données précises entre deux dates (années, mois, jours, heures, etc.). Grâce à cette méthode, je vais pouvoir adapter le contenu de mon email beaucoup plus facilement, sans avoir besoin de faire de calculs.

DateInterval Object
(
    [y] => 0
    [m] => 2
    [d] => 26
    [h] => 14
    [i] => 33
    [s] => 51
    [f] => 0.760226
    [weekday] => 0
    [weekday_behavior] => 0
    [first_last_day_of] => 0
    [invert] => 0
    [days] => 87
    [special_type] => 0
    [special_amount] => 0
    [have_weekday_relative] => 0
    [have_special_relative] => 0
)

29/03/2022

Yann Vangampelaere - nouslesdevs -

NOUS LES DEVS

Vous aimez ce que je fais ? Vous voulez que j'en fasse plus ? dans le développement du blog.