Alain Barraud Mémento informatique  
 
Accueil Logithèque - SE Photo - vidéo Internet - protocoles Site Web PC - Réseau Archives
Page ouverte le 09/03/2010
retour sommaire PHP
Logo PHP
Partie 4 : Les dates

Simple, les dates en PHP. Il y a 2 parties :
  • Possibilités de la fonction date, pour récupérer le jour, le mois etc…
  • Les timestamp, utiles pour faire des calculs sur des dates.
En maîtrisant les dates, ça donne le niveau pour faire un TP "Système de news".
Sommaire

La fonction date

Quand on veut utiliser une date en PHP, c'est une fonction presque incontournable.
date est une fonction à tout faire : si on sait bien l'utiliser, on peut afficher n'importe quel élément de date, dans tous les calendriers du monde.

Exemple pour voir son fonctionnement :
Code PHP
<?php
$jour = date('d');
echo 'Aujourd\'hui, nous sommes le : ' . $jour;
?>
On donne une lettre &agarve; la fonction date. Le résultat renvoyé dépend de la lettre qu'on donne à date.
Ici, on a mis "d" : ça signifie "Renvoyer le numéro du jour".
date peut renvoyer beaucoup de valeur différentes, sans toutes les lister (certaines ne sont pas vraiment utiles), en voici un certain nombre avec leurs significations :
la colonne Exemple contient les valeurs telles qu'elles sont apparues le lundi 29 août 2005 à 0h26
LettreSignificationValeurs possiblesExemple
sSecondes00 à 5953
iMinutes00 à 5926
Hheure00 à 2300
|Indique si l'heure d'été est activée (1 = oui, 0 = non)0 ou 11
ODifférence d'heures avec l'heure GMT (Greenwich)-1200 à +1200+0200
dJour du mois01 à 3129
mMois de l'année01 à 1208
YAnnée, sur 4 chiffresBeaucoup de possibilités2005
yAnnée, sur 2 chiffresBeaucoup de possibilités05
LIndique si l'année est bissextile (1 = oui, 0 = non)0 ou 10
lJour de la semaine écrit en anglaisSunday à SaturdayMonday
FMois écrit en anglaisJanuary à DecemberAugust
tNombre de jours dans le mois28 à 3131
wNuméro du jour de la semaine0 (dimanche) à 6 (samedi)1
WNuméro de la semaine dans l'année01 à 5235
zNuméro du jour de l'année0 à 365240

Le plus embêtant avec date c'est que la fonction est faite pour les anglophones. Il faudra se créer une fonction qui transforme les dates en français.
erreur Précision, c'est l'heure du serveur qui est renvoyée.
Avec ce tableau, on a toutes les informations nécessaires pour travailler sur des dates.
On peut donner plusieurs lettres à la fois à date, comme ceci :
Code PHP
<?php
echo 'Aujourd\'hui, nous sommes le : ' . date('d/m/Y');
?>
alt On n'a pas utilisé de variable cette fois pour la concaténation. C'est normal : on a tout à fait le droit d'utiliser directement une fonction au beau milieu d'une concaténation comme on vient de faire.
date a créé une chaîne de caractères qui contient jour/mois/année. En fait, on peut mettre ce qu'on veut dans date, dès que la fonction rencontre une lettre qu'elle connaît elle la remplace par la valeur correspondante.
Cela veut dire qu'on peut mettre des espaces, des tirets, ou des slashs comme on a fait pour séparer les éléments de date. C'est pratique et ça permet de n'avoir à appeler la fonction qu'une seule fois.
question Et si je veux écrire la lettre H dans date sans que cette lettre soit remplacée par l'heure ?
Il faut mettre un antislash \ devant chaque lettre qu'on ne veut pas voir remplacer. Exemple :
Code PHP
<?php
echo 'Il est ' . date('H \H\e\u\r\e\s');
?>
Ici, on a fait un echo pour écrire "heures", ce qui peut être plus simple.

Le timestamp

Récupérer le timestamp
question C'est quoi un timestamp ?
C'est le nombre de secondes écoulées depuis le 1er Janvier 1970 à Minuit. C'est symbolique, il fallait bien prendre un point de départ.
En fait, ça représente le début de l'époque où le système d'exploitation Unix a été créé.

Bref, le 1er Janvier 1970 à Minuit, le timestamp avait pour valeur 0. Pour conna&iicirc;tre le timestamp actuel en PHP, on utilise la fonction time (qui n'a besoin d'aucun paramètre) :
Code PHP
<?php
echo 'le timestamp actuel est : ' . time();
?>
Le timestamp va nous être très utile et on va voir pourquoi…
Le timestamp avec la fonction date
Il est possible de fournir un second paramètre &agarve; date (après les lettres) : le timestamp sur lequel on veut obtenir des informations.
Par défaut, date utilise le timestamp actuel : elle renvoie donc l'heure actuelle, le jour actuel etc… Mais si on lui donne un timestamp, elle fera des calculs sur ce moment-là.
Pour faire un test, on prend le timestamp qui correspond au moment où l'original de ce chapitre sur le siteduzero a été écrit.
A partir de ce timestamp, on va extraire toutes les informations qu'on veut dessus :
Code PHP
<?php
$timestamp = 1080513608;   // C'est l'heure qu'il était quand l'original de ce tutoriel a été écrit
?>

<p>Voici plein d'infos sur ce timestamp :</p>

<ul>
<li>M@teo a écrit ces lignes le <?php echo date('d/m/Y' , $timestamp); ?></li>
<li>Ce jour-là était un <?php echo date('l' , $timestamp); ?> (désolé, c'est en anglais ;o)</li>
<li>Il était exactement : <?php echo date('H\h i\m\i\n s\s' , $timestamp); ?> (rhoo l'insomniaque !)</li>
<li>Il y avait <?php echo date('t' , $timestamp); ?> jours ce mois-ci.</li>
<li>C'était le <?php echo date('z' , $timestamp); ?>ème jour de l'année !</li>
</ul>
La différence par rapport à ce qu'on a vu au début de ce chapitre, c'est qu'on a donné un deuxième paramètre à la fonction date : ce paramètre, c'est un timestamp. En gros, quand on fait :
echo date('d');, on dit à PHP : "Affiche-moi le numéro du jour actuel".
Mais si on rajoute un timestamp en deuxième paramètre :
echo date('d', $timestamp);, alors là on dit à PHP "Affiche-moi le numéro du jour qu'il était au moment de ce timestamp".

Et ça, ça va être très pratique ! Par exemple, lorsqu'on écrira une news, il nous suffira d'enregistrer juste le timestamp, et on sera capable grâce à ce nombre de ressortir toutes les infos possibles et imaginables dessus : le jour où la news a été postée, l'heure qu'il était etc… C'est donc très puissant !
Récupérer le timestamp à partir d'une date
Enfin, une dernière chose qu'il peut être très utile de savoir faire : par exemple, connaître le timestamp qu'il était le 5 Février 1998 à 13h 45min 26s.
On va utiliser la fonction mktime. On va lui donner en paramètre une date, et elle va nous ressortir le timestamp correspondant.
Cette fonction peut prendre pas mal de paramètres, en voici la liste dans l'ordre :
$timestamp = mktime(heure, minutes, secondes, mois, jour, an, heure d'hiver);
Dans la pratique, on peut oublier le dernier paramètre (heure d'hiver) qui ne nous sera pas utile en général. Il faut savoir qu'il faut mettre 1 si l'heure d'hiver est activée, 0 si elle ne l'est pas.
Donc, Si on enlève l'heure d'hiver pour éviter de s'embrouiller, il reste 6 paramètres possibles qu'on retiendra :
$timestamp = mktime(heure, minutes, secondes, mois, jour, an);

Pour bien comprendre, voici un exemple. Je veux toujours le timestamp du 5 Février 1998 à 13h 45min 26s, je vais écrire le code suivant :
Code PHP
<?php
$vieux_timestamp = mktime(13, 45, 26, 2, 5, 1998);
echo 'Le timestamp du 05/02/1998 à 13h 45mn 26s était : ' . $vieux_timestamp;
?>
erreur Attention, les anglais n'écrivent pas leurs dates au format jour/mois/an mais au format mois/jour/an !
C'est source de confusion : si on regarde bien l'exemple ci-dessus, on a mis le mois avant le jour dans la liste des paramètres !
Si on ne veut pas renseigner l'heure, mais qu'on veut juste obtenir le timestamp d'une date&hellip, bien sur c'est impossible (il évolue de seconde en seconde). La solution communément employée, c'est de se baser sur Minuit :
mktime(0, 0, 0, 2, 5, 1998);. C'est moins précis, mais cela peut suffire.
Un petit exemple pratique ?
On veut retrouver le nom du jour de naissance. On va pour cela créer un formulaire pour récupérer 3 variables : le jour, le mois, et l'année de naissance.
Avec mktime, on récupère le timestamp correspondant.
A partir de là, on a plusieurs possibilités pour la fonction date :
  • Soit on utilise la lettre l (L minuscule) et on obtient le nom du jour en anglais.
  • Soit on est têtu et on veut l'obtenir en français, dans ce cas on récupère juste le numéro du jour de la semaine avec la lettre w (0 = Dimanche, 1 = Lundi…)
Bien évidemment, on va utiliser la seconde solution (en plus comme ça on va voir comment on fait pour "traduire" la date en français).
L'idée est la suivante : on va créer un array qui associera le numéro 0 au texte "Dimanche", le numéro 1 au texte "Lundi" etc…
Ensuite, comme on a le numéro du jour, on donne ce numéro à l'array et on récupère le nom du jour en français qui correspond !

Code PHP
<?php
if (isset($_POST['jour']) AND isset($_POST['mois']) AND isset($_POST['an']))
{
    // Le visiteur vient d'entrer sa date de naissance, on va calculer le jour qu'il était.

    // On calcule le timestamp correspondant à la date entrée
    $timestamp_naissance = mktime(0, 0, 0, $_POST['mois'], $_POST['jour'], $_POST['an']);
    // On récupère le numéro du jour correspondant au timestamp (0, 1, 2, 3…)
    $numero_jour = date('w', $timestamp_naissance);

    // On crée un array pour numéroter les jours (0 => Dimanche, 1 => Lundi…)
    $jours = array('Dimanche', 'Lundi', 'Mardi', 'Mercredi', 'Jeudi', 'Vendredi', 'Samedi');
    // On récupère le nom du jour en français grâce à l'array qu'on vient de créer
    $jour_naissance = $jours[$numero_jour];

    // Puis on affiche le résultat
    echo '<p>Vous êtes né un ' . $jour_naissance . '</p>';
}
else   // Sinon, c'est que le visiteur n'a pas encore entré sa date de naissance, on affiche le formulaire
{
?>

<p>Indiquez votre date de naissance (jj/mm/aaaa) :</p>

<form method="post" action="naissance.php">
<p>
    <input type="text" name="jour" size="2" maxlength="2" /> /
    <input type="text" name="mois" size="2" maxlength="2" /> /
    <input type="text" name="an" size="4" maxlength="4" /><br /><br />
    <input type="submit" value="Envoyer" />
</p>
</form>
<?php
}
?>
La ligne vraiment intéressante dans ce code, c'est celle-ci :
$jour_naissance = $jours[$numero_jour];
On a $numero_jour. On donne ce numéro à notre array $jours, et ça nous ressort le texte qui correspond à ce numéro. Par exemple, si le numéro du jour est 2, alors $jour_naissance aura pour valeur "Mardi" !
erreur Ce code a un sacré défaut : il ne fonctionne pas si on est né avant 1970 !
En effet, le timestamp n'existe que depuis le 1er janvier 1970, donc si on tape 1969 ça ne marchera pas.
A noter que certains systèmes, eux, génèrent un nombre négatif. Cela dépend de plusieurs facteurs, mais il faut savoir, par exemple, que PHP gère cela de manière générale, mais MySQL non. En bref, éviter d'utiliser le timestamp pour des dates antérieures à 1970.
Par ailleurs, il est bon de savoir que le timestamp devient de plus en plus gros, et ce nombre sera tellement gros en 2037 que ça ne marchera plus. En clair, le timestamp fonctionne donc entre 1970 et 2037 !