Débuter avec les dates et le temps [Tuto] - PHP - Programmation
Marsh Posté le 22-10-2004 à 21:20:47
Afficher la date du jour
Affichons la date et l'heure du serveur.
Code :
|
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é :
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 :
|
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 :
|
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 :
|
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é :
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 :
|
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 :
|
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 :
La traduction en code donne :
Code :
|
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 :
|
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 :
|
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.
Marsh Posté le 24-10-2004 à 15:16:33
excellente initiative ce genre de tuto, je plussoie fortement.
Marsh Posté le 24-10-2004 à 15:40:11
Pareillement
Les dates sont pas toujours intuitives sous php
Marsh Posté le 29-10-2004 à 23:36:32
Voilà, d'un coté, c'est un up mais c'est surtout pour souligner que je suis bien content de trouver ce topic ce soir
Marsh Posté le 30-10-2004 à 00:23:45
Par contre pour les dates en français y a beaucoup plus simple :
Code :
|
Marsh Posté le 03-11-2004 à 10:46:03
ratibus a écrit : Par contre pour les dates en français y a beaucoup plus simple :
|
Tout à fait, mais en hébergement mutualisé ou gratuit, setlocale() n'est pas toujours accessible ...
Edit : Orthographe
Marsh Posté le 03-11-2004 à 18:04:58
Je plussoie pour l'initiative, c'est clair que les dates sont un truc qui posent tj pas mal de problemes
Marsh Posté le 07-07-2005 à 22:28:34
Juste un petit up au cas où certains cherchent des infos ou pourraient proposer d'autres exemples
Marsh Posté le 10-07-2005 à 15:13:32
Justement j'aurais une question. Voilà j'essais de convertir un nombre de secondes en un nombre de jours/heures/minutes/secondes mais j'ai toujous 1 jour de trop.
Par exemple:
Code :
|
Et ca m'affiche "01j 3h 00m 00s" au lieu de "00j 3h 00m 00s".
Cela dit le caractère "d" pour gmdate est compris entre 01 et 31 donc il risque pas de m'afficher 0.
Comment faire? isoler le jour et lui retrancher 1
Marsh Posté le 10-07-2005 à 17:01:16
Le problème est que gmdate travaille sur les dates et toi sur le temps. Ce qui n'est pas tout à fait la même chose.
La méthode est d'utiliser les décompositions successives par modulo comme je les utilise plus haut à la fin de mon code sur la mesure du temps
Marsh Posté le 10-07-2005 à 18:47:17
Merci T509, j'ai utilisé la méthode des modulos et me donne le résultat que j'attendais
Marsh Posté le 12-07-2005 à 15:29:04
Bonjour, je cherche à connaitre la date des 4 prochains LUNDI a partir de la date courante (et donc variable)?
Une idée ?
Marsh Posté le 12-07-2005 à 16:57:12
Perso je ferai comme ca:
- Récupération du numéro du jour de la semaine à partir du timestamp actuel et de la fonction gmdate.
- tu en déduis le nombre de jours qui te sépare du lundi suivant.
- tu calcules la date du lundi suivant avec "nb_jour_jusqu_au_prochain_lundi * 60 * 60 * 24".
- apres pour obtenir la date du lundi d'apres tu ajoutes a la date trouvée précédemment "60 * 60 * 24 * 7".
- de même pour le lundi encore après.... etc
Maintenant ya peut etre plus simple et plus rapide, suis pas un pro.
Marsh Posté le 12-07-2005 à 22:59:05
Si tu regardes avec attention le code que j'ai donné, c'est facile de s'inspirer puisque dans l'un des exemples, je me positionne sur le 1er lundi suivante la date du jour.
Marsh Posté le 13-07-2005 à 09:18:06
Il y a un utilisateur sur le forum de developpez.com qui a développé une classe date. Vous pouvez trouver çà ici http://www.developpez.net/forums/v [...] p?t=267535
Marsh Posté le 12-09-2005 à 14:34:13
sinon, pour éviter les calculs de dates (du genre, le jour qu'on était y 19 jours), y'a cette syntaxe de strtotime() très pratique :
Code :
|
source : http://fr3.php.net/manual/en/function.strtotime.php et http://www.gnu.org/software/tar/ma [...] tar_7.html
Sinon, j'ai trouvé encore plus fort (enfin, c'est mon avis perso) :
Code :
|
Marsh Posté le 22-10-2004 à 21:20:02
Salut à tous, j'ai été amené à rédiger ce tutos alors je vous en fait profiter.
A+
---------------
fermez vos topics résolus avec le tag [Résolu] en fin de titre. Merci !