Afficher la date du jour
Affichons la date et l'heure du serveur.
Code :
- <?php
- //affichage de la date et de l'heure sous le format DD/MM/AAAA HH:mm
- echo strftime("%d/%m/%Y %H:%M" );
- ?>
|
Le résultat obtenu est 01/06/2004 12:00
Ce script fait appel à la fonction PHP strftine(). Elle répond à une chaîne de caractères qui lui est donnée en paramètres. Elle remplace les mots-clé inclus dans cette chaîne et les remplace par les éléments demandés de la date.
Voici quelque uns de ces mots-clé :
- %d : donne le numéro du jour du mois courant. Il est compris entre 01 et 31.
- %m : donne le numéro du mois. Il est compris entre 01 et 12.
- %Y : donne l'année sur 4 chiffre.
- %H : donne l'heure sur la base de 24 heures
- %M : donne les minutes.
- %w : donne le numéro du jour de la semaine. Le dimanche est considéré comme le jour 0
- %A : donne le nom complet du jour de la semaine
- %B : donne le nom complet du mois.
Il existe d'autres mots-clé acceptés par cette fonction. Ils sont disponibles et expliqués dans le manuel en ligne de PHP
Il est également possible d'afficher la date en toutes lettres. Regardons ce script :
Code :
- <?php
- //affichage de la date sous le format jour numéro mois année
- echo strftime("%A %d %B %Y" );
- ?>
|
L'exécution de ce script affiche, dans le navigateur web, "tuesday 01 june 2004"
Oui, mais ce n'est pas en français. En effet, le langage PHP est développé et maintenu en anglais. Pour obtenir la date en français, il faut assurer la traduction soit même. Regardons et analysons le script suivant.
Code :
- <?php
- //déclaration des tableaux de correspondance pour avoir les noms en français
- $mois = array(1 => 'Janvier', 'Février', 'Mars', 'Avril', 'Mai', 'Juin', 'Juillet', 'Août', 'Septembre', 'Octobre', 'Novembre', 'Décembre');
- $jour = array('dimanche', 'lundi', 'mardi', 'mercredi', 'jeudi', 'vendredi', 'samedi');
- //récupération du jour
- $no_jour = intval(strftime("%w" ));
- $date = $jour[$no_jour];
- //récupération du numéro du jour dans le mois
- //nous prenons en compte le 1er du mois
- $no_date = intval(strftime("%d" ));
- if ($no_date == 1) $no_date = "1er";
- $date .= " ".$no_date;
- //recuperation du mois
- $no_mois = intval(strftime("%m" ));
- $date .= " ".$mois[$no_mois];
- //ajout de l'année
- $date .= " ".strftime("%Y" );
- //affichage de la date
- echo $date;
- ?>
|
Le résultat affiché sera : mardi 1er Juin 2004
Quelques explications :
Nous avons commencé par déclarer 2 tableaux : $mois et $jour.
Le premier tableau, $mois, contient la liste des mois de l'année. Nous choisissons de faire commencer son index à "1" car le mois "0" n'existe pas.
Le second, $jour, contient la liste des jours de la semaine. Dans le système PHP, le dimanche est le jour "0" de la semaine. Nous utilisons alors un index normal pour le tableau.
strftime("%w" ) renvoie, dans l'exemple, 2. C'est le second jour de la semaine. Cela nous permet d'identifier le nom du jour de la semaine dans le tableau $jour. Toutefois, strftime() renvoie une chaîne de caractères et pour récupérer le nom du jour dans le tableau correctement, nous avons besoin d'une valeur numérique. C'est le rôle de la fonction intval() qui traduit le numéro du jour en numérique.
Nous avons donc $no_jour = 2 et $jour[2] = "mardi". Il reste à donner à $date la valeur $jour[$no_jour]. Donc $date = "mardi" à ce stade ci.
En ce qui concerne le numéro du jour dans le mois, nous le récupérons de la même façon que ci-dessus. Ensuite nous contrôlons s'il est égal à 1. Aujourd'hui, 1er juin, nous avons $no_date = 1. Cela nous permet de remplacer "1" par "1er". Nous ajoutons ceci à la date. A ce stade, $date = "mardi 1er".
Attention : nous avons ici utilisé l'opérateur ".=". Il permet de concaténer ce qui est après le signe = à la fin du contenu de $date. Si le point était oublié, le contenu serait simplement remplacé. Cette opération est équivalente à
$date = $date." ".$no_jour.
Il reste à s'occuper du mois de la même façon que pour le jour et d'ajouter l'année. Nous pouvons ensuite afficher l'ensemble.
Gérer les dates
Dès que l'on doit naviguer dans le calendrier à partir de la date du jour, cela devient vite un casse tête. Il devient difficile de prendre en compte toutes les contraintes : hier, nous étions dans la même semaine que celle-ci ? dans le même mois ? dans la même année ? Cette année est elle bissextile ?
La logique des dates n'est clairement pas aussi simple à gérer qu'un compteur numérique.
Pour l'exemple, nous sommes le mardi 1er juin 2004 soit le 153ème jour de cette année 2004 bissextile. Fixons également l'heure : 14h52.
Pour travailler correctement, il nous faut une référence précise à partir de laquelle nous pourrons effectuer nos calculs. Cette référence a été choisie de manière arbitraire au 1er janvier 1970 à 0h00. A partir de là, si nous connaissons le nombre de secondes écoulées, nous conaissons aussi de la date par simple calcul arithmétique. Ce nombre de secondes est appelé Timestamp.
Nous rappelons seulement qu'une journée est composée de 24 heures divisées en 60 minutes. Ces dernières sont aussi divisées en 60 secondes. Dans une journée, il y a donc 86400 secondes.
Passons au concret ! Nous souhaitons connaître la date à laquelle nous serons dans 43 jours et celle qu'il était 19 jours auparavant. Analysons un peu l'exemple suivant :
Code :
- <?php
- //Récupération du timestamp du jour
- $aujourdhui = time();
- //timestamp dans 43 jours
- $futur = $aujourdhui + 43 * 86400;
- //timestamp 19 jours auparavant
- $passe = $aujourdhui - 19 * 86400;
- //affichage des dates
- echo "Aujourd'hui ".date("l d F Y", $aujourdhui)."<br>";
- echo "Dans 43 jours, nous serons le ".date("l d F Y", $futur)."<br>";
- echo "Il y a 19 jours nous étions le ".date("l d F Y", $passe)."<br>";
- ?>
|
Le résultat de ce script :
Aujourd'hui Tuesday 01 June 2004
Dans 43 jours, nous serons le Wednesday 14 July 2004
Il y a 19 jours nous étions le Thursday 13 May 2004
Que s'est il passé ? Nous avons commencé par récupérer le timestamp du jour. Cela nous a donné le nombre de secondes par rapport au 01/01/1970. Ceci est récupéré par la fonction time(). A ce stade $aujourdhui = 1086040800.
Pour calculer les intervalles de temps, il nous suffit d'ajouter ou de soustraire autant de fois 86400 secondes que l'on souhaite de nombre de jours.
L'étape suivante consiste à transformer les timestamps en date lisible par tous. C'est le rôle de la fonction date(). Elle demande que nous lui fournissions 2 paramètres. Le premier est une chaîne de caractères constitués de mots-clé, le second est le timestamp de la date choisie. La chaîne de caractères fonctionne sur la même idée qu'avec la fonction strftime() utilisée ci-dessus. Toutefois les mots-clé ne sont pas identiques. Quelques mots-clé :
- l : donne le nom du jour en toutes lettres (en anglais)
- d : donne le numéro du jour du mois sur 2 chiffres
- F : donne le nom du mois en toutes lettres (en anglais)
- Y : donne l'année sur 4 chiffres
- G : donne l'heure au format 24h sans zéro initial
- i : donne les minutes
- w : donne le numéro du jour de la semaine (dimanche est zéro)
Les autres mots-clé sont disponibles là : http://fr2.php.net/manual/fr/function.date.php
Maintenant, nous souhaitons travailler avec une date de base autre que celle d'aujourd'hui. Par exemple, nous désirons faire les mêmes calculs à partir du 17/02/2019.
Vous l'aurez compris, nous avons besoin du timestamp de cette date. Regardons le code suivant :
Code :
- <?php
- //Récupération du timestamp du 17/02/2019
- $base = gmmktime(0,0,0,2,17,2019);
- //timestamp dans 43 jours
- $futur = $base + 43 * 86400;
- //timestamp 19 jours auparavant
- $passe = $base - 19 * 86400;
- //affichage des dates
- echo "La date de base ".date("l d F Y", $base)."<br>";
- echo "43 jours après la base ".date("l d F Y", $futur)."<br>";
- echo "19 jours avant la base ".date("l d F Y", $passe)."<br>";
- ?>
|
Le résultat est :
La date de base : Sunday 17 February 2019
43 jours après la base : Monday 01 April 2019
19 jours avant la base : Tuesday 29 January 2019
La seule différence qui est intervenue par rapport à l'exemple précédent est l'introduction de la fonction gmmktime(). Elle calcule le timestamp d'une date donnée. Cette date peut prendre compte de l'heure précise également.
Jusqu'à présent, nous avons travaillé avec un décalage de jours. Il est tout à fait possible de travailler avec un décalage d'heures ou de minutes. L'intervalle utilisé était 86400 secondes. Pour les heures, cet intervalle devient 3600 secondes et pour les minutes, il devient 60 secondes. Exemple :
Code :
- <?php
- //Récupération du timestamp actuel
- $maintenant = time();
- //timestamp dans 43 heures
- $futur = $maintenant + 43 * 3600;
- //timestamp 19 minutes auparavant
- $passe = $maintenant - 19 * 60;
- //affichage des dates
- echo "Nous sommes le : ".date("l d F G:i", $maintenant)."<br>";
- echo "Dans 43 heures : ".date("l d F G:i", $futur)."<br>";
- echo "Il y a 19 minutes : ".date("l d F G:i", $passe)."<br>";
- ?>
|
Le résultat de ce script est :
Nous sommes le : Tuesday 01 June 14:52
Dans 43 heures : Thursday 03 June 9:52
Il y a 19 minutes : Tuesday 01 June 14:33
Nous souhaitons maintenant rendre un dossier dans 19 jours en sachant que nous ne travaillons tous les jours sauf samedi et dimanche. Essayons de mettre en application les fonctions vues ci-dessus. Il nous faut commencer par analyser les contraintes :
- Il ne faut pas que la date de début soit un samedi ou un dimanche. Sinon, il faut se positionner sur le lundi suivant et nous ajoutons donc 1 ou 2 jours à la date courante.
- Il faut savoir quel jour de la semaine nous sommes. En effet, commencer le lundi ou le vendredi ne donnera pas le même résultat.
- On calcule le nombre de jours restant dans la semaine avec l'opération nombre de jours ouvrables + 1 - numéro du jour courant.
- Si le délai est inférieur au nombre de jour encore disponible dans la semaine, alors nous pourrons rendre le dossier avant la fin de semaine. Sinon, il faudra passer un premier week-end et décompter le nombre de jours déjà travaillés. Cela nous donne un temps restant à travailler depuis un lundi.
- De là, il faut connaître le nombre de semaines complètes nécessaires pour réaliser le travail à partir du temps de travail restant. La partie entière de la division du nombre de jours restant par le nombre de jours ouvrables nous y conduit.
- Nous connaissons donc le nombre de week-end total pour réaliser le travail. Il reste à en déduire le nombre de jours chomés à ajouter à la date.
La traduction en code donne :
Code :
- <?php
- $ouvrable = 5; //jours ouvrables dans la semaine
- $delai = 19; //délai en jours ouvrables
- //Récupération du timestamp d'aujourd'hui
- $aujourdhui = time();
- //On se place sur le premier jour ouvrable suivant si aujourd'hui n'est pas ouvrable
- if (gmdate("w", $aujourdhui) == 0) $aujourdhui += 86400;
- if (gmdate("w", $aujourdhui) == 6) $aujourdhui += (86400 * 2);
- //nombre de jours utilisables de la semaine en cours
- $jour_courant = gmdate("w", $aujourdhui);
- $nb_j_util = $ouvrable + 1 - $jour_courant;
- if ($delai > $nb_j_util) {
- //le reste de la semaine en cours n'est pas suffisant
- $delai_restant = $delai - $nb_j_util;
- //nombre de week-end passé = 1 + en fonction du travail restant
- $nb_we = 1 + floor($delai_restant / $ouvrable);
- //nombre de jours chomés à ajouter au délai
- $nb_jour = $nb_we * (7 - $ouvrable);
- }
- else {
- //le reste de la semaine en cours est suffisant
- //il n'y a pas de jour chomés à ajouter
- $nb_jour = 0;
- }
- //calcul du timestamp du jour de rendu
- $rendu = $aujourdhui + 86400 * ($delai + $nb_jour);
- //affichage des dates
- echo "Date de début : ".gmdate("l d F Y", $aujourdhui)."<br>";
- echo "Date de fin : ".gmdate("l d F Y", $rendu)."<br>";
- ?>
|
Le résultat de ce script est :
Date de début : Tuesday 01 June 2004
Date de fin : Monday 28 June 2004
Les fonctions vue plus haut, time() et gmdate(), nous permettent de passer d'une date au timestamp, de faire les calculs et de retrouver une date lisible par tous.
Mesurer le temps
Comment calculer l'intervalle de temps précis depuis un événement ? Là encore les fonctions time() et mktime() sont utiles. Regardons le code suivant :
Code :
- <?php
- //date de l'événement au format YYYY-mm-jj HH:MM:SS
- $date_ini = "2004-04-26 14:12:25";
- $maintenant = time();
- //récupération des éléments de la date à traiter
- $date = explode(" ", $date_ini); //division date et heure
- $heure = explode(":", $date[1]); //division des éléments de l'heure
- $date = explode("-", $date[0]); //division des éléments de la date
- //récupération du timestamp de la date
- $timestamp = mktime($heure[0], $heure[1], $heure[2], $date[1], $date[2], $date[0]);
- //vérification de l'antériorité des dates
- if ($timestamp > $maintenant) {
- //la date à évaluer est dans le futur
- $calcul = "jusqu'au $date_ini , compte à rebours de ";
- $temp = $timestamp;
- $timestamp = $maintenant;
- $maintenant = $temp;
- }
- else {
- //la date à évaluer est dans le passé
- $calcul = "depuis le $date_ini , le temps écoulé est de ";
- }
- //calcul du nombre de jours
- $difference = $maintenant - $timestamp;
- $residu = $difference % 86400;
- $nb_jours = floor(($difference - $residu) / 86400);
- //calcul du nombre d'heures
- $difference = $residu;
- $residu = $difference % 3600;
- $nb_heures = floor(($difference - $residu) / 3600);
- //calcul du nombre de minutes
- $difference = $residu;
- $residu = $difference % 60;
- $nb_minutes = floor(($difference - $residu) / 60);
- //nombre de secondes
- $nb_secondes = $residu;
- //affichage du résultat
- echo $calcul.$nb_jours." jours ".$nb_heures." heures ".$nb_minutes." minutes et ".$nb_secondes." secondes";
- ?>
|
Le résultat est donc :
depuis le 2004-04-26 14:12:25, le temps écoulé est de 36 jours 0 heures 40 minutes et 0 secondes
Le principe est donc simple. Nous commençons par récupérer les différentes éléments de la date : année, jour, mois, heure, minutes et secondes. Nous nous en servons pour calculer le timestamp de cette date. Nous retranchons le timestamp de la date actuelle et nous obtenons le nombre de secondes écoulées (ou restantes) depuis la date fixée. Il reste ensuite à calculer le nombre de jours, d'heures, de minutes et de secondes.
Créer des scripts PHP nécessite parfois d'évaluer leurs performances. Pour cela, un critère objectif est de calculer le temps d'exécution des lignes de code. Oui, mais comment faire ? Une fonction est très utile pour cela : microtime().
Regardons le code source suivant :
Code :
- <?php
- //début de votre script
- $depart = microtime();
- $depart = explode(" ", $depart);
- $depart = (float)$depart[1] + (float)$depart[0];
- //ce bloc est à remplacer par votre code
- $a = 0
- for ($i = 0; $i < 10000000; $i++) {
- $a++
- //incrémente la variable $a 10000000 fois
- //cela sert seulement à allonger le temps d'exécution
- }
- //fin du script
- $fin = microtime();
- $fin = explode(" ", $fin);
- $fin = (float)$fin[1] + (float)$fin[0];
- //affichage du temps d'exécution
- $temps = $fin - $depart;
- echo "temps écoulé : ".$temps." secondes"
- ?>
|
Le résultat est "temps écoulé : 0.00953253 secondes".
L'idée du script et de comparer la date de début et la date de fin.
Analysons le fonctionnement du départ. A l'appel de la fonction microtime(), départ reçoit une chaîne de caractère comme celle-ci :
$depart = "0.36768600 1086772201".
Cette fonction renvoie, comme la fonction time() vue auparavant, le timestamp. Toutefois, elle y ajoute la fraction de seconde écoulée à l'appel de la fonction. C'est une version plus précise de la fonction time().
Pour récupérer les deux valeurs, il faut casser la chaîne de caractères. Nous confions ceci à la fonction explode() en lui demandant de séparer les éléments à chaque espace rencontré. La variable $depart est maintenant un tableau de deux éléments : $depart[0] = "0.36768600" et $depart[1] = "1086772201" .
Il nous reste à additionner ces deux valeurs, en les transformant au passage en nombre réel avec (float), pour obtenir un nombre décimal qui est le timestamp de départ.
A la fin du script nous refaisons la même chose et la simple soustraction des deux dates nous donne le temps écoulé en secondes.
---------------
fermez vos topics résolus avec le tag [Résolu] en fin de titre. Merci !