L'objet DateTime

Résumé Support Quiz

Dans cette leçon, nous allons découvrir le principe des objets en PHP à travers un exemple concret : la manipulation des dates avec DateTime.

Jusqu'à maintenant, on a travaillé avec les dates sous forme d'entiers, avec des timestamps, ou sous forme de chaînes de caractères. Cela fonctionne, mais dès que l'on veut faire des calculs plus complexes, on doit convertir les valeurs et enchaîner plusieurs fonctions.

Les objets permettent de représenter des concepts plus complexes, avec des méthodes et des propriétés adaptées au type de donnée que l'on manipule.

Comprendre le principe d'un objet

Un objet peut être vu comme un type personnalisé. Il vient compléter les types de base comme :

  • les entiers.
  • les chaînes de caractères.
  • les tableaux.

Pour découvrir cette notion, on va utiliser l'objet DateTime, qui permet de représenter une date.

Dans la documentation, DateTime est présenté comme une classe. On y retrouve plusieurs éléments :

  • une déclaration.
  • des constantes.
  • des méthodes.

Les méthodes ressemblent aux fonctions que l'on a déjà utilisées, mais elles sont liées à un objet précis. Par exemple, une méthode de DateTime ne s'utilise que sur un objet DateTime.

Construire un objet DateTime

Pour créer un objet, on utilise le mot-clé new, suivi du nom de la classe.

$date = new DateTime();

Ici, on crée une nouvelle date. Comme aucun paramètre n'est passé au constructeur, PHP utilise la date courante.

Le constructeur correspond à la méthode qui indique comment créer un objet. Dans le cas de DateTime, il peut recevoir une chaîne de caractères représentant une date, ainsi qu'un fuseau horaire. Ces paramètres sont optionnels.

Si on affiche l'objet avec var_dump, PHP indique qu'il s'agit d'un objet de type DateTime et affiche ses propriétés internes.

Utiliser une méthode

Une fonction liée à un objet s'appelle une méthode. Pour appeler une méthode, on utilise la flèche ->.

Par exemple, la méthode format permet d'afficher une date dans un format particulier.

$date = new DateTime(); echo $date->format('d/m/Y');

Le format utilisé est le même que celui que l'on utilise avec la fonction date.

On peut comparer avec une approche plus traditionnelle :

$time = time(); echo date('d/m/Y', $time);

Pour ce premier cas, les deux approches donnent le même résultat. L'intérêt des objets devient plus visible lorsque l'on veut modifier des dates ou calculer des écarts.

Modifier une date

L'objet DateTime propose une méthode modify, qui permet de modifier la date avec une expression comme +1 month.

$date = new DateTime(); $date->modify('+1 month'); echo $date->format('d/m/Y');

Ici, la méthode modifie directement l'objet $date. On n'a pas besoin de sauvegarder son retour dans une nouvelle variable.

Avec une approche par timestamp, on utiliserait plutôt strtotime :

$time = time(); $time = strtotime('+1 month', $time); echo date('d/m/Y', $time);

Les deux solutions permettent d'obtenir une date modifiée, mais l'objet rend la manipulation plus naturelle lorsque les opérations deviennent plus nombreuses.

Calculer l'écart entre deux dates

Imaginons que l'on souhaite calculer le nombre de jours entre deux dates.

Avec une approche procédurale, il faut convertir chaque date en timestamp, faire une soustraction, puis convertir le résultat en jours.

$date1 = '2019-01-01'; $date2 = '2019-04-01'; $time1 = strtotime($date1); $time2 = strtotime($date2); $days = floor(abs($time1 - $time2) / (24 * 60 * 60)); echo "Il y a $days jours de différence";

Avec DateTime, on crée deux objets puis on utilise la méthode diff.

$d1 = new DateTime('2019-01-01'); $d2 = new DateTime('2019-04-01'); $diff = $d1->diff($d2, true); echo "Il y a {$diff->days} jours de différence";

La méthode diff retourne un objet DateInterval. Cet objet représente l'écart entre deux dates.

Accéder aux propriétés d'un objet

Un objet peut aussi contenir des propriétés. Pour les lire, on utilise également la flèche ->.

Dans le cas de DateInterval, la propriété days permet de récupérer le nombre total de jours de différence.

$days = $d1->diff($d2, true)->days;

On peut enchaîner les appels pour rendre le code plus compact :

$days = (new DateTime('2019-01-01'))->diff(new DateTime('2019-04-01'), true)->days;

Dans la vidéo, l'intérêt mis en avant est surtout la lecture du code : on récupère la différence entre deux dates, puis sur cette différence on récupère le nombre de jours.

Afficher un intervalle plus détaillé

Si les dates sont éloignées de plusieurs années, DateInterval fournit aussi des propriétés utiles comme :

  • y pour les années.
  • m pour les mois.
  • d pour les jours restants.
  • h pour les heures.

On peut donc afficher un écart de manière plus détaillée sans refaire tous les calculs à la main.

$d1 = new DateTime('2014-01-01'); $d2 = new DateTime('2019-04-01'); $diff = $d1->diff($d2, true); echo "Il y a {$diff->y} années, {$diff->m} mois et {$diff->d} jours de différence";

Avec les timestamps, ce type d'affichage demanderait beaucoup plus d'opérations.

Créer un DateInterval

On peut aussi construire manuellement un objet DateInterval.

$interval = new DateInterval('P1M1DT1M');

Dans ce format :

  • P indique le début de la période.
  • 1M représente un mois.
  • 1D représente un jour.
  • T introduit la partie liée au temps.
  • 1M après T représente une minute.

Cet intervalle peut ensuite être utilisé avec la méthode add de DateTime.

$interval = new DateInterval('P1M1DT1M'); $date = new DateTime('2019-01-01'); $date->add($interval); var_dump($date);

On obtient alors une date à laquelle on a ajouté un mois, un jour et une minute.

Pourquoi utiliser des objets ?

Les objets permettent de manipuler des concepts plus riches sous forme de petites briques que l'on peut combiner.

Dans le cas des dates, DateTime représente une date et DateInterval représente une durée ou une différence entre deux dates. Chaque objet regroupe les méthodes et propriétés utiles pour travailler avec ce concept.

L'avantage est double :

  • le code est souvent plus naturel à lire.
  • la documentation est plus simple à explorer, car les méthodes disponibles sont regroupées par objet.

PHP permet aussi de créer ses propres objets. C'est ce qui permettra ensuite de mieux organiser son code pour représenter les concepts propres à une application.