Jouer avec les dates en PHP et en Mysql
Ce tutoriel à pour but de faire un tour assez global des possibilités et pratiques pour gérer les dates en PHP et Mysql.
1 - Les formats de dates
Il existe pas mal de formats différents pour les dates, notamment en fonction de la langue, il y a donc des normes qui existent pour définir un format fixe, on utilise le plus couramment pour développer :
- Le timestamp
- Le format ISO/US
Il est important de connaître ces deux formats car l'on passe souvent de l'un à l'autre pour faire des calcul, affichage de dates.
1.1 - Le timestamp
Aussi appelé Unix Timestamp, il correspond au nombre de secondes écoulées depuis le 1er Janvier 1970.
Exemple, nous sommes le 09/04/2008 et il est 14:04:21, le timestamp correspondant est : 1207742661.
1.2 - Le format ISO/US
Le format de date ISO le plus utilisé est le suivant : “AAAA-MM-JJ HH:mm:ss”, on l'utilise aussi sans l'heure : “AAAA-MM-JJ”.
- Y : Année
- M : Mois
- J : Jour
- H : Heure
- m : Minutes
- s : Secondes
Exemple pour la date d'écriture de cet article : 2008-04-09 14:04:21
2 - Utilisation des dates en PHP
2.1 - Les fonctions les plus utilisées
- date() - C'est la fonction la plus utile, elle permet d'afficher la date du jour ou une date passée en paramètre en timestamp dans un format souhaité. Pour plus d'information, rendez-vous sur la doc php : http://fr.php.net/date.
- strtotime() - Cette fonction permet de convertir une date au format ISO/US en timestamp.
- strftime() - Cette fonction est très proche de date() mais permet une gestion de l'écriture des noms de jours, de mois… dans la langue “locale”.
- setlocale() - Cette fonction permet de choisir la langue d'affichage de données en PHP, dans notre exemple avec LC_TIME nous controllerons la langue de strftime().
- mktime() - Cette fonction permet de créer une date en timestamp à partir des numéro de jours, de mois…
2.2 - Quelques opérations de base
2.2.1 - Afficher la date à partir d'un timestamp
2.2.2 - Afficher un format "français" à partir d'un format ISO/US
2.2.3 - Afficher la date en français
// Affiche : Nous sommes le Mercredi 9 Avril 2008 et il est 14h04. setlocale(LC_TIME, "fr_FR", "fr_FR@euro", "fr", "FR", "fra_fra", "fra"); echo "Nous sommes le ".strftime("%A %d %B %Y et il est %Hh%M", 1207742661)
2.2.4 - Faire des calculs de date
Nous allons dans cet exemple chercher la date d'il y a 3 ans et 6 mois et 43 jours, sans faire de calculs savants.
// Affiche : 27/08/2004 14:34:30 $time = mktime(date("H"), date("i"), date("s"), date("m")-6, date("d")-43, date("Y")-3); echo date("d/m/Y H:i:s", $time);
A noter que si vous partez d'une autre date vous pouvez la passer en paramètre de la fonction date() en timestamp.
mktime(date("H", 1207742661), date("i", 1207742661)...
2.3 - Conclusion en PHP
Il est donc préférable en PHP, si vous partez d'un format “folklorique”, du type 09/04/2008, de le transformer en ISO pour pouvoir en faire ce que vous voulez après.
$tmp = explode("/", "09/04/2008"); $date_iso = $tmp[2]."-".$tmp[1]."-".$tmp[0];
3 - Utilisation des dates en Mysql
3.1 - Le stockage des dates
C'est LA grande question pour la gestion des dates en Mysql, on nous propose en effet en type de champs “timestamp, time, date et datetime”.
Date et datetime correspondent au format ISO/US présenté plus haut, le datetime stockant aussi l'heure.
Et bien je répondrais que c'est un peu au choix du développeur, certain préfèrent stocker du timestamp, d'autre (comme moi) préfèrent stocker un format ISO.
Je commenterais donc de manière totalement subjective mon choix de stocker un format ISO:
- Cela permet d'avoir une lisibilité immédiate de la date dans la base de données
- La plupart des fonction Mysql sont plus simple à utiliser à partir d'un format ISO : http://dev.mysql.com/doc/refman/5.0/fr/date-and-time-functions.html
3.2 - Quelques fonctions utiles
Je ne vais pas aller très loin sur ce paragraphe Mysql mais voici quand même quelques fonctions utiles assez souvent pour insérer et sélectionner des dates.
3.2.1 - Insérer une date ISO dans la base de donnée.
En supposant que le champs “date_test” est en DATE ou en DATETIME
INSERT INTO date_test VALUES (NOW());
3.2.2 - Sélectionnez une partie de date
Exemple : On cherche les lignes d'avril
SELECT * FROM matable WHERE MONTH(date_test) = 4;
3.2.3 - Calcul de dates dans une requete Mysql
Il est parfois inutile de recourir au PHP pour faire des calculs de date, Mysql propose ses propres fonctions comme DATE_ADD() et DATE_SUB()
Plus d'informations sur la page complète d'utilisation des fonctions de dates Mysql :
http://dev.mysql.com/doc/refman/5.0/fr/date-and-time-functions.html
Conclusion
Il est possible de faire beaucoup de conversions et de calculs avec les fonctions de base proposées en PHP et en Mysql, rien ne sert de se compliquer comme dans le tutoriel suivant : Convertir une date timestamp en format français avec PHP
En savoir plus
