Aller au menu - Aller au contenu

[Plan du site] Vous êtes ici --- > Le Site du Zér0 > Les tutoriels > Officiels > Site Web > Lecture du tutoriel

Les dates

Avatar
Auteur : M@teo21
Créé : le 29/08/2005 00:17:08
Modifié : le 03/07/2008 11:07:48
Noter et commenter ce tutoriel
Imprimer ce tutoriel
Après ce TP de livre d'or, nous allons faire une pause en passant à quelque chose pas prise de tête : les dates avec PHP.

Ce chapitre est constitué de 2 parties :
En plus, je vais vous dire quelque chose qui va vous motiver : en maîtrisant les dates, vous aurez le niveau pour attaquer un TP "Système de news" ! :D
Sommaire du chapitre :
Chapitre précédent Sommaire Chapitre suivant

La fonction date

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 : PHP
1
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 :p

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

LettreSignificationValeurs possiblesExemple
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 : PHP
1
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 : PHP
1
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 :

Image utilisateur


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 !

Le timestamp

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 ? o_O

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 : PHP
1
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 ! :D

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 : PHP
1
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 :

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 ! :D

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 ! :)

Q.C.M.

Il est minuit. Que renvoie date dans ce cas ? (vous avez le droit de vous servir du tableau plus haut)

Code : PHP
1
date('H \H');
Que renvoie time() ?
Lequel de ces 3 codes est identiques à celui-ci ?
Code : PHP
1
2
3
<?php
date('d/m/Y');
?>
Si ma variable $timestamp contient le timestamp du 28 Février d'une année bissextile à Minuit, que va renvoyer date dans ce cas ?
Code : PHP
1
2
3
<?php
date('t', $timestamp);
?>
Qu'affiche ce code ?
Code : PHP
1
2
3
4
5
6
<?php
$timestamp1 = mktime(0, 0, 0, 11, 21, 2006);
$timestamp2 = mktime(0, 0, 0, 11, 22, 2006);
$timestamp_calcul = ($timestamp2 - $timestamp1) / (60 * 60 * 24);
echo $timestamp_calcul;
?>
Lequel de ces codes produit le même nombre que time() ?


Voilà tout à fait le genre de chapitre que je prends plaisir à rédiger : c'est assez facile à comprendre et pourtant riche en informations. Vous en apprenez beaucoup, et c'est d'autant plus intéressant quand on sait que ça va nous être utile tout de suite.
Eh oui, ladies and gentlemen, nous allons maintenant passer au TP que vous attendiez tous : un système de news pour votre site ! :D
Chapitre précédent Sommaire Chapitre suivant
Auteur : M@teo21
Noter et commenter ce tutoriel
Imprimer ce tutoriel

Changer de design | En savoir plus | Plan du site | Politique d'accessibilité | Règles | Fil RSS | XHTML 1.0 | CSS 2.0
Édité par Simple IT SARL : Nous contacter | Revue de presse | Publicité

Y'a plus rien à lire, faut remonter maintenant !

Hébergement web - Correction de tutoriels - Créer un site
Vous souhaitez apparaître ici ? Contactez-nous.

Nombre de connectés 87 Zéros connectés | Requêtes SQL 10 requêtes | Temps de génération de la page : Total (SQL) 0.4378s (0.4245s)