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ère | Signification |
---|---|
d | Représente le jour du mois en deux chiffres (entre 01 et 31) |
j | Représente le jour du mois en chiffres sans le zéro initial (de 1 à 31) |
D | Repré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) |
N | Représente le jour de la semaine en chiffre au format ISO-8601 (lundi = 1, dimanche = 7) |
w | Représente le jour de la semaine en chiffre (dimanche = 0, samedi = 6) |
z | Représente le jour de l’année de 0 (1er janvier) à 365 |
W | Représente le numéro de la semaine au format ISO-8601 (les semaines commencent le lundi) |
m | Représente le mois de l’année en chiffres avec le zéro initial (de 01 à 12) |
n | Représente le mois de l’année de chiffres sans le zéro initial (de 1 à 12) |
M | Représente le mois en trois lettres en anglais (Jan, Feb…) |
F | Représente le mois en toutes lettres en anglais |
t | Représente le nombre de jours contenus dans le mois (de 28 à 31) |
Y | Représente l’année sur 4 chiffres (ex : 2019) |
y | Représente l’année sur 2 chiffres (ex : 19 pour 2019) |
L | Renvoie 1 si l’année est bissextile, 0 sinon |
a et A | Ajoute « am » ou « pm » (pour a) ou « AM » ou « PM » (pour A) à la date |
h | Représente l’heure au format 12h avec le zéro initial |
g | Représente l’heure au format 12h sans zéro initial |
H | Représente l’heure au format 24h avec le zéro initial |
G | Représente l’heure au format 24h sans le zéro initial |
i | Représente les minutes avec le zéro initial |
s | Représente les seconds avec le zéro initial |
v | Représente les millisecondes avec le zéro initial |
O et P | Indique 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 |
c | Représente la date complète au format ISO 8601 (ex : 2019-01-25T12:00:00+01:00) |
r | Représente la date complète au format RFC 2822 (ex : Fri, 25 Jan 2019 12 :00 :00 +0100) |
Z | Repré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>
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>
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ère | Signification |
---|---|
%a | Représente le jour de la semaine en trois lettres en anglais |
%A | Représente le jour de la semaine en toutes lettres en anglais |
%u | Représente le jour de la semaine en chiffre au format ISO-8601 (lundi 1, dimanche = 7) |
%w | Représente le jour de la semaine en chiffre (dimanche = 0, samedi = 6) |
%d | Représente le jour du mois en deux chiffres (entre 01 et 31) |
%j | Représente le jour de l’année avec les zéros de 001 à 366 |
%U | Représente le numéro de la semaine de l’année en ne comptant que les semaines pleines |
%V | Repré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) |
%m | Représente le mois sur deux chiffres de 01 à 12 |
%b | Représente le nom du mois en lettres en abrégé |
%B | Représente le nom complet du mois |
%y | Représente l’année sur deux chiffres |
%Y | Représente l’année sur 4 chiffres |
%H | Représente l’heure, de 00 à 23 |
%k | Représente l’heure de 0 à 23 |
%I (i majuscule) | Représente l’heure de 01 à 12 |
%M | Représente les minutes de 00 à 59 |
%S | Représente les secondes de 00 à 59 |
%T | Identique à %H:%M:%S |
%D | Identique à %m/%d/%y |
%x | Représente la date sans l’heure au format préféré en se basant sur la constant locale |
%c | Affiche 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>