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
Lettre | Signification | Valeurs possibles | Exemple |
s | Secondes | 00 à 59 | 53 |
i | Minutes | 00 à 59 | 26 |
H | heure | 00 à 23 | 00 |
| | Indique si l'heure d'été est activée (1 = oui, 0 = non) | 0 ou 1 | 1 |
O | Différence d'heures avec l'heure GMT (Greenwich) | -1200 à +1200 | +0200 |
d | Jour du mois | 01 à 31 | 29 |
m | Mois de l'année | 01 à 12 | 08 |
Y | Année, sur 4 chiffres | Beaucoup de possibilités | 2005 |
y | Année, sur 2 chiffres | Beaucoup de possibilités | 05 |
L | Indique si l'année est bissextile (1 = oui, 0 = non) | 0 ou 1 | 0 |
l | Jour de la semaine écrit en anglais | Sunday à Saturday | Monday |
F | Mois écrit en anglais | January à December | August |
t | Nombre de jours dans le mois | 28 à 31 | 31 |
w | Numéro du jour de la semaine | 0 (dimanche) à 6 (samedi) | 1 |
W | Numéro de la semaine dans l'année | 01 à 52 | 35 |
z | Numéro du jour de l'année | 0 à 365 | 240 |
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.
 |
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');
?>
 |
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.
 |
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
 |
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;
?>
 |
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" !
 |
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 !