Obtenir et formater une date en PHP

Dans cette nouvelle leçon, nous allons apprendre à récupérer une date en PHP et à la formater pour la rendre lisible pour nous et nos visiteurs.

 

La fonction PHP date() et les formats de date

La fonction PHP date() va nous permettre d’obtenir une date selon le format de notre choix.

Cette fonction va pouvoir prendre deux arguments. Le premier argument correspond au format de date souhaité et est obligatoire. Le deuxième argument est facultatif et va être un Timestamp relatif à la date qu’on souhaite retourner.

Si le Timestamp est omis, alors la fonction date() se basera sur la date courante du serveur.

Pour indiquer le format de date qu’on souhaite voir renvoyer à la fonction date(), nous allons lui passer une série de lettres qui vont avoir une signification spéciale.

Les caractères les plus couramment utilisés pour formater une date sont les suivants :

CaractèreSignification
dReprésente le jour du mois en deux chiffres (entre 01 et 31)
jReprésente le jour du mois en chiffres sans le zéro initial (de 1 à 31)
DReprésente le jour de la semaine en 3 lettres (en anglais)
l (L minuscule)Représente le jour de la semaine en toutes lettres (en anglais)
NReprésente le jour de la semaine en chiffre au format ISO-8601 (lundi = 1, dimanche = 7)
wReprésente le jour de la semaine en chiffre (dimanche = 0, samedi = 6)
zReprésente le jour de l’année de 0 (1er janvier) à 365
WReprésente le numéro de la semaine au format ISO-8601 (les semaines commencent le lundi)
mReprésente le mois de l’année en chiffres avec le zéro initial (de 01 à 12)
nReprésente le mois de l’année de chiffres sans le zéro initial (de 1 à 12)
MReprésente le mois en trois lettres en anglais (Jan, Feb…)
FReprésente le mois en toutes lettres en anglais
tReprésente le nombre de jours contenus dans le mois (de 28 à 31)
YReprésente l’année sur 4 chiffres (ex : 2019)
yReprésente l’année sur 2 chiffres (ex : 19 pour 2019)
LRenvoie 1 si l’année est bissextile, 0 sinon
a et AAjoute « am » ou « pm » (pour a) ou « AM » ou « PM » (pour A) à la date
hReprésente l’heure au format 12h avec le zéro initial
gReprésente l’heure au format 12h sans zéro initial
HReprésente l’heure au format 24h avec le zéro initial
GReprésente l’heure au format 24h sans le zéro initial
iReprésente les minutes avec le zéro initial
sReprésente les seconds avec le zéro initial
vReprésente les millisecondes avec le zéro initial
O et PIndique la différence d’heures avec l’heure GMT sans deux points (pour O, ex : +0100) ou avec deux points (pour P, ex : +01:00)
I (i majuscule)Renvoie 1 si l’heure d’été est activée, 0 sinon
cReprésente la date complète au format ISO 8601 (ex : 2019-01-25T12:00:00+01:00)
rReprésente la date complète au format RFC 2822 (ex : Fri, 25 Jan 2019 12 :00 :00 +0100)
ZReprésente le décalage horaire en secondes par rapport à l’heure GMT

Cela fait beaucoup de signes différents et bien évidemment personne ne vous demande de tous les retenir d’un coup. Contentez-vous de retenir et de comprendre que nous allons pouvoir grâce à ces caractères récupérer une date selon différents formats ce qui va être très pratique pour ensuite pouvoir travailler avec les dates.

Essayons d’utiliser ces caractères avec date() afin de renvoyer la date sous différents formats :

<!DOCTYPE html>
<html>
    <head>
        <title>Cours PHP & MySQL</title>
        <meta charset="utf-8">
        <link rel="stylesheet" href="cours.css">
    </head>
    
    <body>
        <h1>Titre principal</h1>
        <?php
            echo date('d/m/Y'). '<br>';
            echo date('l d m Y h:i:s'). '<br>';
            echo date('c'). '<br>';
            echo date('r'). '<br>';
        ?>
        <p>Un paragraphe</p>
    </body>
</html>

 

Utilisation de la fonction date en PHP

Il y a deux choses principales à noter ici : déjà, on va pouvoir séparer nos différents caractères de dates avec des tirets, des points, des slashs ou des espaces pour rendre une date plus lisible.

Ensuite, notez également qu’il faudra faire bien attention à la casse lorsqu’on définit un format d’heure puisque la plupart des caractères ont deux significations totalement différentes selon qu’on les écrit en minuscule ou en majuscule.

 

Formater une date en PHP : la gestion du décalage horaire

Notez que la fonction date() formate une date localement, ce qui signifie que la date renvoyée va être la date locale (avec le décalage horaire). Si on souhaite retourner une date GMT, alors on utilisera plutôt la fonction gmdate() qui va s’utiliser exactement de la même manière.

Par ailleurs, il est également possible que la date renvoyée ne corresponde pas à celle de l’endroit où vous vous trouvez si le serveur qui héberge votre site se situe sur un autre fuseau horaire ou s’il a été paramétré sur un fuseau horaire différent du vôtre.

Pour régler ce problème, on peut utiliser la fonction date_default_timezone_set() en lui passant un fuseau horaire sous un format valide pour définir le fuseau horaire qui devra être utilisé pour les fonctions relatives à la date utilisées dans le script.

Le fuseau horaire qui va particulièrement nous intéresser va être Europe/Paris. Pour le liste complète des fuseaux horaires valides, je vous invite à lire la documentation officielle : http://php.net/manual/fr/timezones.php.

<!DOCTYPE html>
<html>
    <head>
        <title>Cours PHP & MySQL</title>
        <meta charset="utf-8">
        <link rel="stylesheet" href="cours.css">
    </head>
    
    <body>
        <h1>Titre principal</h1>
        <?php       
            echo date('d m Y h:i:s'). '<br>';
            echo gmdate('d-m-Y h:i:s'). '<br>';
            date_default_timezone_set('Europe/Moscow');//Moscou = GMT+3
            echo date('d m Y h:i:s'). '<br>';
            echo gmdate('d-m-Y h:i:s'). '<br>';
        ?>
        <p>Un paragraphe</p>
    </body>
</html>

 

Utilisation des fonctions set-default-timezone et set-gmdate en PHP

Ici, on modifie notre fuseau horaire de référence pour prendre celui de Moscou au milieu de notre code. Le résultat de la fonction date() appelée ensuite va donc être différent de précédemment.

Rappelez-vous bien ici que le code est lu linéairement dans notre script, c’est-à-dire ligne après ligne. Il faudra donc bien faire attention à l’endroit où on définit les fonctions comme date_default_timezone_set() afin d’avoir les résultats attendus.

 

Transformer une date en français

Par défaut, les dates vont être renvoyées en anglais par la plupart des serveurs. Pour transformer une date en anglais vers du français, nous avons plusieurs solutions mais une est recommandée par les éditeurs du PHP : l’utilisation des fonctions setlocale() et strftime().

La fonction setlocale() va nous permettre de modifier et de définir de nouvelles informations de localisation. On va déjà pouvoir passer une constante à cette fonction qui va définir les données qui doivent être définies localement : la comparaison de chaines de caractères, la monnaie, les chiffres et le séparateur décimal, les dates ou tout cela à la fois.

Dans notre cas, nous allons nous contenter de modifier les informations de localisation pour le format de date et d’heure et allons pour cela utiliser la constante LC_TIME.

En plus de la constante, il va falloir passer un tableau en deuxième argument de setlocale() qui va nous permettre de choisir la langue souhaitée pour nos informations de localisation.

Notez que la valeur « correcte » du deuxième argument censé déterminer la langue va pouvoir être différente d’un système d’opérations à l’autre car celle-ci n’est pas standardisée. Pour le Français par exemple certains systèmes vont utiliser fr, d’autres fr_FR ou d’autres encore fra.

Par sécurité, on va donc indiquer un maximum de valeurs dans ce tableau : la fonction setlocale() sélectionnera ensuite la première qui est reconnue.

Avec setlocale(), nous avons défini des informations de localisation. Cependant, les fonctions date() et strtotime() par exemple vont ignorer ces informations et continuer de travailler uniquement en anglais.

La seule fonction relative à la date qui supporte la localisation en PHP est la fonction strftime() et c’est donc celle que nous allons utiliser avec setlocale().

Nous allons passer à cette fonction des caractères qui vont représenter des parties de date, de la même façon qu’on avait pu le faire avec la fonction date().

Attention cependant : les caractères ne vont pas forcément être les mêmes et signifier la même chose que pour date() et nous allons cette fois-ci devoir les préfixer avec un %.

CaractèreSignification
%aReprésente le jour de la semaine en trois lettres en anglais
%AReprésente le jour de la semaine en toutes lettres en anglais
%uReprésente le jour de la semaine en chiffre au format ISO-8601 (lundi 1, dimanche = 7)
%wReprésente le jour de la semaine en chiffre (dimanche = 0, samedi = 6)
%dReprésente le jour du mois en deux chiffres (entre 01 et 31)
%jReprésente le jour de l’année avec les zéros de 001 à 366
%UReprésente le numéro de la semaine de l’année en ne comptant que les semaines pleines
%VReprésente le numéro de la semaine de l’année en suivant la norme ISO-8601 (si au moins 4 jours d’une semaine se situent dans l’année alors la semaine compte)
%mReprésente le mois sur deux chiffres de 01 à 12
%bReprésente le nom du mois en lettres en abrégé
%BReprésente le nom complet du mois
%yReprésente l’année sur deux chiffres
%YReprésente l’année sur 4 chiffres
%HReprésente l’heure, de 00 à 23
%kReprésente l’heure de 0 à 23
%I (i majuscule)Représente l’heure de 01 à 12
%MReprésente les minutes de 00 à 59
%SReprésente les secondes de 00 à 59
%TIdentique à %H:%M:%S
%DIdentique à %m/%d/%y
%xReprésente la date sans l’heure au format préféré en se basant sur la constant locale
%cAffiche la date et l’heure basées sur la constant locale
<!DOCTYPE html>
<html>
    <head>
        <title>Cours PHP & MySQL</title>
        <meta charset="utf-8">
        <link rel="stylesheet" href="cours.css">
    </head>
    
    <body>
        <h1>Titre principal</h1>
        <?php       
            echo strftime('%A %d %B %Y %I:%M:%S'). '<br>';
            setlocale(LC_TIME, ['fr', 'fra', 'fr_FR']);
            echo strftime('%A %d %B %Y %I:%M:%S'). '<br>';
            echo strftime('%x'). '<br>';
            echo strftime('%T'). '<br>';
            echo strftime('%c'). '<br>';
        ?>
        <p>Un paragraphe</p>
    </body>
</html>

 

Utilisation des fonctions setlocale et strftime pour passer une date PHP au format local

Laisser un commentaire