Quand on veut utiliser une date en PHP, c'est une fonction presque incontournable.
En fait,
date est une fonction à tout faire : si vous savez bien l'utiliser, vous pourrez afficher n'importe quel élément de date, dans tous les calendriers du moooonde
Pour voir comment elle fonctionne, basons-nous sur cet exemple :
Code : PHP1
2
3
4 | <?php
$jour = date('d');
echo 'Aujourd\'hui, nous sommes le : ' . $jour;
?>
|
On donne une lettre à la fonction
date. Le résultat renvoyé dépend de la lettre que vous donnez à date.
Ici, j'ai mis "d" : ça signifie "Renvoyer le numéro du jour".
Mais... Je pouvais pas deviner moi que "d" signifiait "Renvoyer le numéro du jour" ?!
Non en effet, vous ne pouviez pas deviner
date peut renvoyer beaucoup de valeur différentes, je ne vais pas toutes vous les lister car certaines ne vous seront vraiment pas utiles.
En voici déjà un bon paquet, et la signification qui va avec :
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 |
| I |
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 à 366 |
240 |
Comme vous pouvez le constater, le plus embêtant avec
date c'est que la fonction est faite pour... des anglais. Il n'y a pas moyen qu'elle affiche les jours de la semaine en français

A partir de là, ou vous vous contentez des mots anglais, ou vous créez vous-même une fonction qui transforme les dates anglaises en français.
Je précise aussi que c'est l'heure du
serveur qui est renvoyée, et non pas celle du client. Le serveur du Site du Zér0 étant basé à Paris, si vous habitez ailleurs dans le monde il ne faut pas vous étonner si les valeurs ne sont pas les mêmes que chez vous

Bon, avec ce tableau vous avez toutes les informations nécessaires pour travailler sur des dates.
Mais vous n'avez pas encore tout vu : on peut donner plusieurs lettres à la fois à
date, comme ceci :
Code : PHP1
2
3 | <?php
echo 'Aujourd\'hui, nous sommes le : ' . date('d/m/Y');
?>
|
Vous avez peut-être été surpris de voir que je n'ai pas utilisé de variable cette fois pour la concaténation. C'est normal : j'ai tout à fait le droit d'utiliser directement une fonction au beau milieu d'une concaténation comme je viens de faire.
date a créé une chaîne de caractères qui contient jour/mois/année. En fait, vous pouvez mettre ce que vous voulez dans
date, dès que la fonction rencontre une lettre qu'elle connaît elle la remplace par la valeur correspondante.
Cela veut dire que vous pouvez mettre des espaces, des tirets, ou des slashs comme j'ai fait pour séparer les éléments de date. C'est pratique, ça nous 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 ?
Bah là, c'est délicat : il va falloir mettre un antislash
\ devant chaque lettre que vous ne voulez pas voir remplacée.
Par exemple :
Code : PHP1
2
3 | <?php
echo 'Il est ' . date('H \H\e\u\r\e\s');
?>
|
Dans cet exemple 3.4.3, la fonction
date est interprétée comme ceci :
Comme vous pouvez le constater, il est plus simple de faire un echo pour écrire "Heures", mais cette technique pourra vous être utile à l'occasion, donc je vous l'apprends
C'est tout pour
date, il n'y a pas grand chose d'autre à redire dessus, c'est tout simple à utiliser !
Bon, jusqu'ici il n'y avait rien de bien extraordinaire. Vous avez juste vu que PHP savait donner tout ce dont vous avez besoin pour afficher la date.
Mais vous n'avez pas vu le plus intéressant : le
timestamp.
Récupérer le timestamp
C'est quoi un timestamp ?

Un timestamp, c'est un nombre.
C'est le nombre de secondes écoulées depuis le 1er Janvier 1970 à Minuit.
Pourquoi 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éé. Peut-être avez-vous déjà entendu parler de Unix ? Il est à la base de Linux, un système d'exploitation comme Windows (sauf qu'il est gratuit, mais ne nous égarons pas ^^).
Bref, le 1er Janvier 1970 à Minuit, le timestamp avait pour valeur 0. Aujourd'hui, beaucoup beaucoup de secondes se sont écoulées, vous devez vous en douter.
Pour connaître le timestamp actuel en PHP, on utilise la fonction
time (qui n'a besoin d'aucun paramètre) :
Code : PHP1
2
3 | <?php
echo 'Le timestamp actuel est : ' . time();
?>
|
Si vous vous amusez à recharger la page chaque seconde, vous allez voir que le timestamp n'arrête pas d'augmenter. Eh oui, le timestamp est un nombre qui devient chaque seconde plus gros !
Bon, à partir de là vous devez vous dire que le timestamp, c'est bien rigolo, mais ça sert pas à grand chose.
Faux : au contraire ça va vous être très utile, nous allons voir pourquoi...
Le timestamp avec la fonction date
Il est possible de fournir un second paramètre à
date (après les lettres) : le timestamp sur lequel vous voulez obtenir des informations.
Par défaut,
date utilise le timestamp actuel : elle renvoie donc l'heure actuelle, le jour actuel etc... Mais si vous lui donnez un timestamp, elle fera des calculs sur ce moment-là.
Allez, pour faire un test grandeur nature, je vous donne en =>
exclusivité mondiale<= le timestamp qu'il était au moment où j'ai écrit ces lignes
1104276413
On a donc un timestamp, et on va extraire toutes les informations qu'on veut dessus :
Code : PHP 1
2
3
4
5
6
7
8
9
10
11
12
13 | <?php
$timestamp = 1080513608; // C'est l'heure qu'il était quand j'écrivais le tutoriel !
?>
<p>Voici plein d'infos sur mon 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>
|
Pour l'affichage du jour en anglais, ne confondez pas : il s'agit d'un L minuscule et non pas du chiffre 1 !
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"
Ca, ça va être un truc très très pratique !
Par exemple, lorsque vous écrirez une news, il vous suffira d'enregistrer juste le timestamp, et vous serez capables 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 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 : vous aimeriez connaître le timestamp qu'il était le 5 Février 1998 à 13h 45min 26s (très précisément :p).
Pour récupérer le timestamp correspondant, 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, vous pouvez oublier le dernier paramètre (heure d'hiver) qui ne vous sera pas utile en général. Sachez qu'il faut mettre 1 si l'heure d'hiver est activée, 0 si elle ne l'est pas.
Mais passons. 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 (oui je suis têtu ^^), je vais écrire le code suivant :
Code : PHP1
2
3
4 | <?php
$vieux_timestamp = mktime(13, 45, 26, 2, 5, 1998);
echo 'Le timestamp du 05/02/1998 à 13h 45min 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 vous regardez bien l'exemple ci-dessus, j'ai mis le mois avant le jour dans la liste des paramètres !
Si vous ne voulez pas renseigner l'heure, mais que vous voulez juste obtenir le timestamp d'une date... ce n'est pas possible (il y a plein de timestamp différents dans une journée je vous rappelle !)
La solution communément employée, c'est de se baser sur Minuit :
mktime(0, 0, 0, 2, 5, 1998);
C'est le timestamp du 5 Février 1998 à Minuit. Ce n'est peut-être pas aussi "précis" que l'exemple du dessus me direz-vous, mais on n'a parfois pas besoin d'autant de précision.
Un petit exemple pratique ?
On veut retrouver le nom du jour où vous êtes né. 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êtus 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...)
Vous vous en doutez, on va utiliser la seconde solution (en plus comme ça vous allez comprendre 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... Revoyez le début du chapitre sur les array si vous avez oublié, c'est vraiment tout simple.
Après, vu qu'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 !
Regardez bien ce code :
Code : PHP 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35 | <?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
}
?>
|
Avec un peu de logique, vous allez vite comprendre comment ça marche.
Si vous avez revu le début du chapitre sur les array, vous avez donc bien compris qu'on a associé le numéro 0 à "Dimanche", 1 à "Lundi" etc...
La ligne vraiment intéressante dans notre 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" !
Si ce petit code arrive à faire quelque chose d'assez impressionnant, il a un sacré défaut : il ne fonctionne pas si vous êtes né avant 1970 !
En effet, le timestamp n'existe que depuis le 1er janvier 1970, donc si vous tapez 1969 ça ne marchera pas.
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 !