6.Le langage PHP
6.10.Les dates
6.10.2.Les fonctions natives PHP
6.10.2.6.Contrôler la validité d'une date
Pour contrôler la validité d'une date (dont vous avez extrait les données jour, mois et année
[comment?]), vous pouvez avoir recours à la fonction
checkdate() en passant en paramètre (et dans l'ordre indiqué) le mois, le jour et l'année. Cette fonction retournera false en cas de date invalide. Finis les 31 Avrils, 30 Février et autres 35 Décembre.
<?php
$mois = 12;
$jour = 35;
$annee = 2001;
if (checkdate($mois, $jour, $annee)) {
echo "La date $jour/$mois/$annee existe bien";
} else {
echo "La date $jour/$mois/$annee n'est pas valide";
}
?>
|
Attention: L'ordre des paramètres n'est pas jour, mois, année mais mois, jour, année |
6.10.2.7.Le temps à la microseconde près
Il est également possible de récupérer la date à la microseconde près (ceci dit, il est probable que cette fonctionnalité ne soit pas disponible sous Windows - je n'ai pas vérifié) en utilisant la fonction gettimeofday().
<?php
$tableau = gettimeofday();
echo "Il s'est écoulé ".$tableau['sec']." secondes et ".
$tableau['usec']." microsecondes depuis le 1er Janvier 1970.<br />";
?>
Exemple:
Il s'est écoulé 1737127018 secondes et 21098 microsecondes depuis le 1er Janvier 1970.
Ce qui permet par exemple d'estimer le temps d'execution d'une instruction.
<?php
$top0 = gettimeofday();
echo "Combien de temps pour afficher ce message ?<br>";
$top1 = gettimeofday();
$duree["sec"] = $top1["sec"]-$top0["sec"];
$duree["usec"] = $top1["usec"]-$top0["usec"];
if ($duree["usec"]<0) {
$duree["sec"]--;
$duree["usec"]+=1000000;
}
echo "Il a fallu ".$duree["sec"]." secondes et ".
$duree["usec"]." microsecondes<br />";
?>
Exemple:
Combien de temps pour afficher ce message ?
Il a fallu 0 secondes et 2 microsecondes
Cette fonction à la particularité de stocker l'information dans un tableau, ce qui est également le cas des fonctions
localetime() et
getdate().
6.10.2.8.Mise en pratique
6.10.2.8.1.Affichage des dates issues d'une base de donnée type MySQL
Lorsque vous récupérez la valeur d'un champ date, de type DATE, issu d'une base de données MySQL, celle-ci est par défaut formattée selon le schéma suivant : AAAA-MM-JJ (année sur 4 chiffres, un tiret, mois sur 2 chiffres, un tiret, jour sur 2 chiffres).
Si le champ est de type DATETIME ou TIMESTAMP, la valeur aura la forme AAAA-MM-JJ hh:mm:ss (format de DATE + un espace, heure sur 2 chiffres, deux points, minutes sur 2 chiffres, deux points, secondes sur 2 chiffres).
Si le champ est de type DATE mais retourné sous forme "numérique", la valeur aura la forme AAAAMMJJ (année sur 4 chiffres, mois sur 2 chiffres, jour sur 2 chiffres.
Si le champ est de type TIMESTAMP mais retourné sous forme "numérique", la valeur aura la forme AAAAMMJJhhmmss (format "numérique" de DATE + heure sur 2 chiffres, minutes sur 2 chiffres, secondes sur 2 chiffres).
Pour transformer ces valeurs en nombre de secondes depuis le 1er Janvier 1970 00:00:OO UTC (Epoch) il suffit de faire appel à
strToTime().
Après conversion en nombre de secondes, je peux afficher:
<?php
setLocale(LC_TIME, 'fr_FR.utf8');
// Nous supposons, ici, que suite à une requête SQL (MySQL)
// et après lecture du résultat
// nous avons $date = "2002-02-01" (type DATE)
$date = '2002-02-01';
$nbSecondes = strToTime($date);
echo ' La date '.$date.' sous le format: '.
strftime('%A %d %B %Y', $nbSecondes)."\n";
// Cette fois, c'est un type DATETIME ou TIMESTAMP
$date = '2003-02-01 10:23:30';
$nbSecondes = strToTime($date);
echo ' La date '.$date.' sous le format: '.
strftime('%A %d %B %Y %H:%M:%S', $nbSecondes)."\n";
// Cette fois, un type DATE retourné sous "forme numérique"
$date = '20040201';
$nbSecondes = strToTime($date);
echo ' La date '.$date.' sous le format: '.
strftime('%A %d %B %Y %H:%M:%S', $nbSecondes)."\n";
// Cette fois, un type TIMESTAMP retourné sous "forme numérique"
$date = '20050201102330';
$nbSecondes = strToTime($date);
echo ' La date '.$date.' sous le format: '.
strftime('%A %d %B %Y %H:%M:%S', $nbSecondes)."\n";
?>
Après conversion en nombre de secondes, je peux afficher:
La date 2002-02-01 sous le format: vendredi 01 février 2002
La date 2003-02-01 10:23:30 sous le format: samedi 01 février 2003 10:23:30
La date 20040201 sous le format: dimanche 01 février 2004 00:00:00
La date 20050201102330 sous le format: mardi 01 février 2005 10:23:30
Si le champ est de type DATE mais retourné sous forme "numérique", la valeur aura la forme AAAAMMJJhhmmss.000000 (format "numérique" de TIMESTAMP + point + 6 chiffres) dans ce cas
strToTime() ne peut plus être appliqué directement mais il suffit d'un petit pré-traitement pour s'en sortir.
Après conversion en nombre de secondes, je peux afficher:
<?php
setLocale(LC_TIME, 'fr_FR.utf8');
// Nous supposons, ici, que suite à une requête SQL (MySQL)
// et après lecture du résultat
// nous avons $date = '20060201102330.000000' (type DATETIME en "numérique")
$dateAvecMicrosec = '20060201102330.000000';
list($date, $microsec) = explode('.', $dateAvecMicrosec);
$nbSecondes = strToTime($date);
echo ' La date '.$dateAvecMicrosec.' sous le format: '.
strftime('%A %d %B %Y %H:%M:%S', $nbSecondes).'.'.$microsec;
?>
Après conversion en nombre de secondes, je peux afficher:
La date 20060201102330.000000 sous le format: mercredi 01 février 2006 10:23:30.000000