formations / php / les-dates-en-php
Les dates en PHP
Manipuler les dates en programmation, et plus spécifiquement pour le web revêt un caractère fondamentale. Les dates bien sûr permettent l'affichage du temps, mais aussi du tri, de la planification, des calculs de durées, etc.
La manipulation des dates est essentielle pour que les informations soient corrects et cohérantes afin de fournir une expérience utilisateur de qualité.
Structure d'une date
Les dates sont composées d'éléments qui servent à leur déclaration que ce soit en affichage, comme en stockage dans la base de données. Ces éléments sont les suivants :
- Année (Year) : Y l'année sur quatres chiffres comme 2021 par exemple ou y l'année sur deux chiffres, 21 par rapport à l'exemple précedent.
- Mois (Month) : m pour avoir le mois sur 12.
- Jour (Day) : d le jours entre 0 et 31 suivant les mois
- Heure (Hour) : les heures sur 24 heures H et les heures sur 12 heures h.
- Minutes (Minute) : Les minutes sont réprésentées dans une date par i.
- Seconde (Second) : Naturellement, les secondes sont gérées par l'éléments s.
Les dates sont sauvegardées uniquement au format US, c'est à dire Y m d H i s.
Manipuler les dates en Php
La fonction date
La fonction date est essentiellement utilisée pour créer ou afficher des dates dans un fomat donné comme l'illustre le code ci-dessous. Il est à noter que dans cet exemple, la variable est $dateMaintenant est exprimée dans des guillemets doubles ou "magic quote". Dans ce type de guillemets, les variables peuvent être affichées dans la page.
<?php
$dateMaintenant = date("d-m-Y H:i:s");
echo "La date actuelle est : $dateMaintenant";
?>
La fonction strtotime
En Php, la fonction strtotime permet de convertir une date, par exemple, générée avec la fonction date vue précédemment, en timestamp Unix. Un timestamp Unix est un nombre correspondant au nombre de secondes écoulées depuis le 1er janvier 1970. On peut tester avec ce code :
<?php
$dateMaintenant = date("2023/01/02");
$dateTimeStamp = strtotime($dateMaintenant);
echo "Le timestamp correspondant à la date $dateMaintenant est $dateTimeStamp";
?>
La fonction mktime
La fonction mktime permet de créer un timestamp Unix, comme la fonction strtotime, mais en lui passant en paramètres les informations relatives à la date à convertir.
<?php
$dateTimeStamp = mktime(23, 2, 0, 8, 19, 2023);
echo "Le timestamp du 19 août 2023 à 23 heures 02 minutes 0 secondes est : $dateTimeStamp";
?>
Comme l'illustre le code, la fonction mktime attend les paramètres suivants :
mktime(heure, minutes, secondes, jour, mois, année).
Convertir les dates
Un des problèmes souvent rencontré réside dans le fait que les dates sont stockées dans les base de données au format américain (Y-d-m H:i:s)
Pour rappel :
- Y correspond à l'année sur quatres chiffres
- d correspond au jour
- m correspond au mois
- H correspond à l'heure sur la base 0/24 heures
- i correspond aux minutes
- s correspond aux secondes
En France, nous n'avons pas la même représentation, il nous faut donc convertir les dates pour les afficher ou encore pour les injecter dans la base de données, voici un exemple de la conversion d'un chaîne de caractères au format US qui est convertie au format FR à l'aide des fonctions date et strtotime.
<?php
// La date au format US c'est à dire, mm/dd/YYYY
$dateUs = "08/19/2023";
// Conversion de la date US en FR c'est à dire dd/mm//YYYY
$dateFr = date("d/m/Y", strtotime($dateUs));
// On affiche la date dans la page
echo "La date en format FR est $dateFr";
?>
Maintenant, on peut imaginer la situation inverse, on a une date au format FR qu'il nous faut convertir au format US. Cette opération fonctionne comme la précédente, si ce n'est que nous allons convertir la chaîne de caractères de la date FR "19/08/2023" en format US "08-19-2023" avec l'aide de la fonction de manipulation de chaîne str_replace.
<?php
// On déclare la date au format FR
$dateFr = "19/08/2023";
// On fait la conversion vers le format US
$dateUs = date("m-d-Y", strtotime(str_replace("/", "-", $dateFr)));
// On affiche la date dans la page
echo "La date convertie au format Us est : $dateUs";
?>
La classe DateTime
Il exite en php la classe DateTime, cette classe s'avère particulièrement pratique pour la prise en charge des fuseaux horaires ou encore le calcul de durée. Nous allons en voir quelques exemples.
Conversion de date
On peut également convertir les dates à l'aide de la classe DateTime comme l'illustre le code ci-dessous :
<?php
// On déclare la date à convertir, une date US par exemple
$dateUs = "8/20/2023";
// On crée un objet DateTime à partir de la date US à convertir
$objetDate = DateTime::createFromFormat("m/d/Y", $dateUs);
// On converti la date au format FR
$dateFr = $objetDate->format("d/m/Y");
// On affiche le résultat
echo "La date au format FR est : $dateFr";
?>
Intervalles de temps
La classe DateTime permet également d'additionner ou de soustraire des intervalles de temps. On utilise alors les méthodes add() ou sub() de la classe DateTime.
<?php
// On déclare une date
$date = new DateTime("2023-08-20");
// On déclare l'intervalle à additionner
$interval = new DateInterval("P3D");
// On ajoute l'interval à la date
$date->add($interval);
// On affiche le résultat
echo "La date avec l'ajout de l'intervalle est : ".$date->format("Y-m-d");
?>
Dans l'exemple précédent, on instancie un objet de date à l'aide de la classe DateTime et on passe en paramètre une chaîne de caractères représentant la date au format US. Ensuite on instancie l'intervalle que l'on souhaite ajouter à la date à l'aide de la classe DateInterval. Le paramètre passé correspond à l'intervalle que l'on souhaite, dans l'exemple "P3D" signifie "Plus 3 jours". Pour finir, on ajoute les trois jours à la date d'origine à l'aide la méthode add().
On procéderait de la même manière pour soustraire avec la méthode sub().
Différence entre deux dates
On peut également utiliser la classe DateTime pour calculer la différence entre deux dates, pour cela on fait appel à la méthode diff().
<?php
// On déclare les deux dates
$d1 = new DateTime("2023-08-16");
$d2 = new DateTime("2023-08-18");
// On déclare un variable dans laquelle on calcule la différence.
$diff = $d1->diff($d2);
// On affiche le résultat
echo $diff->format("%R%a jours");
?>
Dans l'exemple ci-dessous, %R permet d'obtenir le signe + ou le signe - dans le résultat affiché. %A correspond au nombre de jours.
Comparer des dates
Avec la classe DateTime il est également possible de comparer des dates de manière simple à l'aide d'opérateurs de comparaison comme l'illustre le code ci-dessous.
<?php
// On déclare les deux dates à comparer
$d1 = new DateTime("2023-08-12");
$d2 = new DateTime("2023-08-16");
// On compare les dates avec un opérateur de comparaison.
if($d1<$d2){
echo "d1 est antérieure à d2";
}else{
echo "d2 est antérieure à d1";
}
?>
Vous pouvez télécharger le fichier source pour voir le résultat des différents exemples de ce tutoriel.
Tutos du jour
Entités & relations
Les entités et les différents types de relation OneToOne, OneToMany, ManyToOne, ManyToMany
Voir le tuto