Gérer les dates en PHP

Formation

À Paris

Prix sur demande

Appeler le centre

Avez-vous besoin d'un coach de formation?

Il vous aidera à comparer différents cours et à trouver la solution la plus abordable.

Description

  • Typologie

    Formation

  • Lieu

    Paris

Grâce à cette formation vous pourrez acquérir les connaissances nécessaires qui vous permettrons d’ajouter des compétences à votre profil et obtenir de solides aptitude qui vous offriront de nombreuses opportunités professionnelles.

Les sites et dates disponibles

Lieu

Date de début

Paris ((75) Paris)
Voir plan
7 Cité Paradis, 75010

Date de début

Consulter

Questions / Réponses

Ajoutez votre question

Nos conseillers et autres utilisateurs pourront vous répondre

À qui souhaitez-vous addresser votre question?

Saisissez vos coordonnées pour recevoir une réponse

Nous ne publierons que votre nom et votre question

Les Avis

Le programme

Introduction du cours

Les dates en PHP ont toujours été une question fondamentale pour les développeurs. Comment stocker, gérer, manipuler les dates ou les intervalles de temps.

La plupart des développeurs vous crieront : "le timestamp mon ami !!! le timestamp"...

Mais ils auraient tort. Eh bien oui, le timestamp c'est quoi au juste ? Le timestamp c'est un nombre de secondes écoulées depuis le 1er janvier 1970. Cela signifie qu'il faut toujours se creuser la tête pour passer d'un timestamp à une date et vice-versa.

Oui oui je sais, la fonction date() de php vous retranscrit un timestamp en date php. Mais quid des dates antérieures au 1er janvier 1970 ? Comment stockeriez-vous la date d'anniversaire de vos grands-parents ? Comment calculeriez-vous l'âge de vos grands-parents à partir de leur date de naissance ? Bah vous le feriez mais à grand coup de fonctions lourdes et complexes auxquelles vous ne comprendriez rien et vous mettriez un temps fou à les écrire et encore, si vous le faîtes vous-même... Bref vous perdriez votre temps en recherche...

Alors arrêtez de chercher sur internet ! La réponse est là, le DateTime PHP ! Celui-ci couplé à DateInterval, gérer toutes vos dates deviendra un véritable jeu d'enfants.
Sans plus attendre, entrons dans le vif du sujet !

Une conséquence heureuse de ce tutoriel sera la migration d'une application écrite avec le timestamp vers une application gérée par DateTime. Nous donnerons une partie des codes nécessaires au fur et à mesure de l'avancement du tutoriel. Néanmoins plus amples explications et un détail plus complet de la partie SQL vous est déjà donnée par Taguan dans son tutoriel

Comme certaines parties de l'API ne sont pas procédurales et que la POO est aujourd'hui très utilisée pour les projets de toutes les tailles, nous avons choisi de ne vous présenter
que le code orienté objet. Néanmoins, si vous suivez les liens vers la documentation que nous vous donnons, vous aurez à disposition les équivalents procéduraux des fonctions que nous vous proposons.

DateTime : au delà du timestampPasser du timestamp à DateTime

En PHP, pour se servir de date, au tout départ était le timestamp.Le timestamp, c'est le nombre de secondes qui se sont passées depuis le 1er janvier 1970. Ça en fait des secondes croyez moi !Pendant très longtemps tout cela a suffit, le timestamp était à la base de tout dans tous les langages, c'était un standard. On ne s'en plaignait pas trop, le web n'était pas trop développé, gérer les dates en PHP était très courant (pour les forums) mais n'était pas très développé.

Avec le temps, le timestamp est devenu de plus en plus long,
parallèlement, avec le développement du web, l'utilisation des dates est
devenue plus fréquente et plus complexe.

Les gestionnaires de base de données relationnelles tels que MySQL ou Postgres  avaient déjà montré la puissance d'un type de données propre aux dates plutôt que le timestamp en lui même. Notamment, parce que cela permettait de ne conserver que la partie "date" ou la partie "time" (c'est à dire heures, minutes, secondes). Oui mais PHP a mis quelques temps à suivre car de tels outils sont difficiles à créer et que les développeurs de PHP avaient d'autres soucis à l'époque.Le problème c'est que ça obligeait les gens à toujours passer par strtotime pour changer leur date SQL en date php. En plus c'était un vrai casse tête pour mettre les jours en français, en allemand... Alors les développeurs de PHP ont décidé d'inclure dans la version 5.2 l'objet DateTime et quelques autres outils que nous découvrirons dans la suite du tutoriel.

LL'essentiel des fonctions suivantes sont présentes dans la version 5.2, mais certaines nécessitent la version 5.3. Je ne peux que vous recommander de passer à cette version là, voire la version 5.5 du langage.

Syntaxe

Pour générer un DateTime et profiter de sa puissance il y a trois méthodes, utilisant soit le constructeur soit createFromFormat :

  • Soit on veut juste la date d'aujourd'hui : <?php $date = new DateTime();

  • Une date à un format standard, par exemple une date stockée dans une base de donnée :

    <?php // Le 2ème argument c'est pour être sûr qu'il n'y aura pas //de décalage horaire $date = new DateTime($maDateDansMaBDD,new DateTimeZone('Paris/Europe'));
  • Avec un format qui n'est pas standard, par exemple JJ/MM <?php $date = DateTime::createFromFormat('d/m',$maDate);

Si votre BDD stocke les dates au format UNIXTIME (notre fameux timestamp), il vous est largement conseillé de convertir votre table grâce à la commande  FROM_UNIXTIME de MySQL.

Pour ce qui est du fuseau horaire, nous verrons cela plus en détail dans une partie suivante.

J'ai un petit problème : je désire souhaiter l'anniversaire de quelqu'un qui est né le 29 février, que se passe-t-il?

Le 29 février est une date particulière. PHP est néanmoins capable de comprendre que comme il n'existe pas tout le temps, si vous demandez 29-02-2013, ça veut juste dire que vous voulez une date équivalente à ce 29 février mais en 2013, à savoir le 1er mars.

Par contre le 29 février est la seule date "particulière". Si vous donnez une date fausse, par exemple le 32 mars ou le 31 avril, il ne comprendra pas et enverra une Exception (POO oblige).

Encore plus fort : les dates relatives

Attaquons-nous à une nouveauté qu'apporte le dateTime : la datation relative. Si l’appellation semble barbare, c'est parce qu'elle cache quelque chose de très puissant que les timestamp ne vous permettent pas de gérer facilement. Imaginez-vous que vous désirez connaître la date de fin d'un évènement.

Vous savez quand a commencé l'évènement, et combien de temps il dure. Une solution semble donc de créer un DateTime puis de dire "ajoute-moi la durée que je désire". Seulement cela signifie des lignes de codes supplémentaires et puis cela n'aurait pas grand intérêt. Une autre solution est de dire "je veux la date qui est x temps après la date de départ".

L'intérêt, c'est qu'en faisant ça, vous n'écrivez qu'une seule ligne de code et que cette ligne a un sens précis et est parfaitement lisible. C'est très bien, cela crée un code propre et de qualité.

Maintenant, il faut savoir comment faire pour dire cela à PHP. Tout se passe dans le constructeur de DateTime (ou dans la fonction date_create). Vous allez tout d'abord écrire la date de départ (disons le 14-02-2012) puis vous allez écrire, en anglais, la durée. Cela donne par exemple :

<?php $date = new DateTime('14-02-2012 +1 day');

Encore plus fort, vous pouvez utiliser des mots clefs comme "first", "last","next". Ces mots-clefs permettent d'atteindre une date dont on ne connait qu'un minimum d'informations : je sais que c'est
samedi prochain, que c'est le premier mercredi du mois de juillet. Par exemple je sais que c'est samedi prochain, que c'est le premier mercredi du mois de juillet... Par exemple, vous désirez prévoir quand sera le prochain essai de la sirène des pompiers (en France, le premier mercredi de chaque mois). Il suffit de l'écrire en anglais "first Wednesday of next month".

Si vous voulez ajouter une composante relative à votre date après l'avoir créée il est possible de le faire grâce à la méthode modify.

DateTimezone ou la gestion du fuseau horaire

Un des grands problèmes lorsqu'on veut gérer les heures, c'est que tout le monde sur terre n'est pas à la même heure. Entre fuseau horaire et heures d'été vous aurez vite fait de tomber dans des problèmes difficilement solubles.

Vous n'êtes pas sans savoir que sur notre bonne vieille Terre, il y a 24 fuseaux horaires. Ceux-ci allant de -12 à +12 en passant par Greenwich. Afin de vous assurer que chacun de vos utilisateurs visualise votre site à sa propre heure, vous devez régler le fuseau horaire de votre site ce qu'on appelle en php le Timezone.

Il y a différentes façons de gérer ce Timezone. Soit vous définissez un Timezone fixe pour toute votre application mais seul les utilisateurs de votre fuseau auront la bonne heure, les autres verront un décalage horaire.

Il faudra donc définir votre fuseau horaire de façon dynamique et vous pourrez le faire grâce à DateTimeZone.

Cet objet vous permettra de paramétrer le fuseau horaire pour chacun de vos DateTime afin que chaque utilisateur voit les dates sans aucun décalage horaire. Avouez tout de même que c'est plus agréable pour eux ?

DateTimeZone étant un objet, il renvoie des exceptions en cas d'erreur de fuseau. On peut donc le placer dans des blocs try/catch.

Sans plus tarder, voici comment on construit un fuseau horaire.

<?php try{ $tz = new DateTimeZone($fuseau); } catch(Exception $e){ exit($e->getMessage()); }

Ici $fuseau représente une chaine de caractère qui va déterminer le fuseau horaire justement.

Cette chaîne de caractère ne doit pas ressembler à n'importe quoi. Par ailleurs, il existe des constantes pré-existantes pour choisir son fuseau, par exemple DateTimeZone::AFRICA, DateTimeZone::AMERICA, etc.

Mais bon ce n'est pas assez précis et on ne sait pas vraiment quel fuseau on a choisit. Il y a donc toute une liste des fuseaux horaires.

Revenons maintenant à notre DateTime. Jusqu'à maintenant vous aviez défini des DateTime sans vous soucier du fuseau horaire. Maintenant que nous savons que c'est possible de le choisir pour chacune de nos dates, nous allons marier les deux éléments pour obtenir des dates encore plus justes

<?php $tz = new DateTimeZone('Europe/Paris'); $date = new DateTime('2012-03-09 17:26:30', $tz);//utilisera le bon fuseau horaire $tzLondres = new DateTimeZone('Europe/London'); $date->setTimezone($tzLondres);//et l'heure est modifiée en fonction :-)

Et voilà, notre DateTime est défini au 9 mars 2012 à 17h26min30sec sur le fuseau de Europe/Paris.

Cela veut dire que notre DateTime est à +2 par rapport à Greenwich (en été, +1 en hiver) !

Ne pas donner le fuseau lors de la création de votre DateTime signifierait que celui-ci va utiliser le fuseau par défaut, celui du serveur. Et en règle générale c'est rarement celui de Paris. Donc vous pouvez préciser le fuseau horaire à chaque fois en donnant le second paramètre.

Cela vous obligera par contre à préciser le premier. C'est pourquoi, si vous désirez dire simplement "aujourd'hui", vous devrez mettre en premier paramètre "now". Pour éviter de préciser tout le temps le fuseau horaire si vous avez décider d'avoir un fuseau fixe, vous pouvez en préciser un par défaut vous-même.

Pour cela deux situations sont possibles :

  • Soit vous avez accès au php.ini et vous changez la propriété default_timezone avec le fuseau horaire de votre choix.Soit vous n'y avez pas accès et vous utilisez la fonction <?php date_default_timezone_set();

  • Si en revanche vous avez décidé de faire plaisir à tous vos utilisateurs quelque soit le pays d'où il se connecte, vous devez donc gérer tous les fuseaux horaires !

Le meilleur moyen donc est de créer le timezone dans une page spécifique de votre application pour que vous n'ayez plus qu'à l'utiliser.

Avec les nouvelles versions de PHP il est obligatoire de préciser un fuseau horaire pour que cela fonctionne. En effet cela amenait à des comportements étranges si la machine n'était pas bien configurée.

DateInterval pour gérer des intervalles de tempsIntervalle entre deux dates : DateInterval

Il vous est peut-être déjà arrivé d'avoir besoin de gérer un intervalle de temps. Que ce soit pour gérer la durée de construction d'un bâtiment ou de création d'unité dans un jeu de type Ogame ou simplement pour vérifier depuis combien de temps l'utilisateur ne s'est pas connecté ou bien encore pour savoir si l'utilisateur a bien laissé passer 24h avant de revoter.

Toutes ces petites choses peuvent être stockées très facilement dans un DateInterval. L'avantage de cette solution, c'est que DateInterval se marie parfaitement avec un DateTime. Vous l'aurez compris, DateInterval nous servira à déterminer l'espace de temps que l'on souhaitera ajouter ou soustraire à nos DateTime (mais nous le verrons dans la partie suivante). Pour l'heure, apprenons déjà à créer nos DateInterval.

DateInterval permet donc de définir un intervalle de temps. Il a très peu de méthodes et est donc très simple d'utilisation.

  • DateInterval:: __construct     : pour construire l'objet à partir d'un format spécifique

  • DateInterval:: createFromDateString : pour construire l'objet à partir d'un string (en)

  • DateInterval:: format  : pour formater l'intervalle à l'affichage

Le format spécifique d'un DateInterval est stricte mais facile à comprendre. Pour toute la partie date, on commence le format par un P en majuscule et pour toute la partie horaire on commence par un T majuscule. Le reste du format étant très intuitif, il suffit de précéder la lettre du format par un nombre. Voici la liste des formats acceptés :

Type de la période

Format

Un nombre d'années

Y

Un nombre de mois

M

Un nombre de jours

D (incompatible avec W)

Un nombre d'heures

H

Un nombre de minutes

M

Un nombre de secondes

S

Un nombre de semaines

W (incompatible avec D)

 

 

Pour mieux comprendre ce tableau, voici une petite application :

<?php // On crée un intervalle très complet $intervalle = new DateInterval('P1Y2W6MT2H35M54S'); /* * Ici, on a définit un intervalle de 1 an 2 semaines 6 mois 2 heures 35 minutes et 54 secondes * J'ai mis toutes les possibilités mais on peut très bien ne mettre que la partie horaire * ou que la partie date ou juste le mois, juste l'année, juste le jour, etc etc * Toutes les...

Appeler le centre

Avez-vous besoin d'un coach de formation?

Il vous aidera à comparer différents cours et à trouver la solution la plus abordable.

Gérer les dates en PHP

Prix sur demande