Gestion des dates en PHP / MySQL

calendarioParmis les calvaires récurrents dans le développement web, on peut citer les dates. Du formatage à la comparaison, il y a toujours plusieurs façons de faire les choses.

On utilise souvent le timestamp UNIX (nombre de secondes écoulés depuis le 1er Janvier 1970), alors qu’il y a beaucoup plus simple : le type DateTime, très pratique lors de la sélection sur une plage de date en base données, et surtout lisible sans couversion.

Opération

Pour déclarer un objet DateTime à la date actuelle:

$date = new DateTime();

Il est également possible de spécifer une date en passant en paramètre une chaîne de caractère au format ‘YYYY-MM-DD HH:MM:SS’.

Là où l’objet DateTime devient vraiment pratique, c’est lorsqu’il s’agit de récupérer des dates relatives. Par exemple, le premier jour du mois peut être obtenu de la façon suivante:

$dateTime = new DateTime();
$dateTime->modify('first day of this month)

Pour les différentes possibilités, c’est sur la page des format relatifs que les informations sont disponibles

On peut également utiliser un DateInterval pour récupérer une date à un intervalle d’une autre (ici le lendemain):

$interval = new DateInterval('P1D');
$dateTime->add($interval);

Les variantes sont vraiment nombreuses et à consulter dans la doc du constructeur du DateInterval.

Comparaison

Comment savoir si un objet DateTime est supérieur à un autre ?

if ($date1 > $date2)

Désolé, on pouvait pas faire plus simple.

On peut également récupérer l’intervalle entre deux date avec l’objet DateInterval vu plus haut:

$interval = $date1->diff($date2);

Format

L’affichage de la valeur contenue dans un objet de type DateTime se fait en une ligne est peut prendre n’importe quel format. Par exemple, pour afficher ‘YYYY-MM-DD HH:MM:SS’, voici comment faire:

$dateTime->format('Y-m-d H:i:s')

Et là où ce format va s’avérer très pratique, c’est que c’est celui stocké par MySQL. Par exemple, pour sélectionner toutes les lignes sur une journée, la clause where sera la suivante:

WHERE date BETWEEN "'.$date->format('Y-m-d 00:00:00').'" AND "'.$date->format('Y-m-d 23:59:59').';"

Je vous laisse voir la partie précédente pour sélectionner par exemple toutes les lignes sur une semaine, ou encore toutes les lignes depuis le début du mois.

Tous les variable qui peuvent être utilisées en tant que format sont disponibles ici.

Publié par

gcko

#iOS developer at @applydia, former #Epitech student, «I'm am currently making your smartphone smarter»