Afficher la date du jour en français avec PHP
Lorsque nous utilisons des dates dans un environnement PHP/MySQL, elles se retrouvent généralement sous deux formats :
Y-m-d H:i:s
en base de donnée (le formatDATETIME
)d/m/Y
en HTML, pour l’affichage
Pour changer le format d’une date, on passe généralement par une étape intermédiaire : le timestamp (l’heure Unix, ou Posix selon les appellations). On récupère ce timestamp à l’aide de la fonction strtotime()
, et on le repasse sous un autre format à l’aide de la fonction date()
:
$date = '27-09-2013';
echo date('Y-m-d H:i:s', strtotime($date));
// 2013-09-27 00:00:00
Le soucis avec cette méthode, c’est que vous êtes bridé sur votre format de départ. En Europe, nous utilisons des dates du type jour-mois-année, alors qu’outre Atlantique, on utilise un type année-mois-jour. Afin d’éviter toute confusion possible entre ces deux types, la fonction strtotime()
(PHP 4, PHP 5, PHP 7, PHP 8) utilise une convention :
- Si le séparateur est un tiret (-), la date est considérée comme étant européenne
- Si le séparateur est un slash (/), la date est considérée comme étant américaine
En reprenant notre exemple, mais en modifiant simplement le séparateur, plus rien ne fonctionne :
$date = '27/09/2013';
echo date('Y-m-d H:i:s', strtotime($date));
// 1970-01-01 01:00:00
[Attention] Depuis la version PHP 8.1
strftime
est obsolète.DateTime::format()
fournit un remplacement rapide, tandis queIntlDateFormatter::format()
fournit une solution plus sophistiquée.Exemple :
$locale = $this->modx->getOption('locale') ?? '';
$timezone = $this->modx->getOption('timezone') ?? '';
$formatter = new IntlDateFormatter($locale, IntlDateFormatter::SHORT, IntlDateFormatter::SHORT, $timezone);
return $formatter->format(new DateTime());
La solution à ce problème se trouve dans la classe DateTime
. Cette classe permet elle aussi de travailler sur les dates, avec une approche orientée objet. Une approche donc un peu plus verbeuse, mais qui a ses avantages. La classe DateTime
permet en effet de spécifier le format de la date en entrée, quand vous voulez récupérer le timestamp. Notre code devient donc :
$date = '27/09/2013';
$dt = DateTime::createFromFormat('d/m/Y', $date)
echo $dt->format('Y-m-d H:i:s');
// 2013-09-27 13:07:29
Il n’y a plus qu’a se préparer une petite classe utilitaire pour simplifier l’utilisation du tout :
class DateFormat {
public static function alter($date, $before, $after) {
return DateTime::createFromFormat($before, $date)->format($after);
}
public static function toSQL($date, $before = 'd/m/Y') {
return self::alter($date, $before, 'Y-m-d H:i:s');
}
public static function toHTML($date, $before = 'Y-m-d H:i:s') {
return self::alter($date, $before, 'd/m/Y');
}
}
$date = '27/09/2013';
echo DateFormat::toSQL($date);
// 2013-09-27 13:07:29
Afficher la date du jour en français avec PHP
Pour afficher la date du jour en français avec PHP, vous devez :
- Définir les informations de localisation avec la fonction
setlocale
. - Définir le décalage horaire par défaut avec la fonction
date_default_timezone_set
. - Utiliser la fonction
strftime
pour formater la date avec la configuration locale. - Éventuellement utiliser
utf8_encode
pour gérer les problèmes d’accentuation.
Remarque : utf8_encode
n’est nécessaire que si vous n’avez pas déclaré l’encodage à utiliser dans votre code HTML :
<!DOCTYPE html>
<html lang="fr">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
...
Voici le code PHP pour afficher une date PHP en français :
<?php
setlocale(LC_TIME, 'fr_FR');
date_default_timezone_set('Europe/Paris');
echo utf8_encode(strftime('%A %d %B %Y, %H:%M'));
?>
Remarque : remplacez la dernière ligne par echo strftime('%A %d %B %Y, %H:%M');
si vous avez déclaré l’encodage dans votre code HTML comme explicité précédemment.
Vous trouverez d’avantage d’informations concernant strftime
via http://php.net/manual/fr/function.strftime.php.
PHP 8.1 : les fonctions strftime et gmstrftime sont obsolètes
Les fonctions strftime
et gmstrftime
formatent un horodatage Unix basé sur les paramètres régionaux actuels définis à l’aide de la fonction setlocale
. La fonction gmstrftime
est similaire à strftime
, sauf qu’elle renvoie l’heure en temps moyen de Greenwich (GMT).
La fonction setlocale
définit les paramètres régionaux sur le processus PHP, plutôt que sur le thread de travail actuel. Cela peut entraîner un changement soudain des paramètres régionaux si un autre thread appelle la fonction setlocale
. Cela peut être particulièrement gênant si PHP est utilisé dans une API serveur multi-thread (comme mod_php
pour PHP).
PHP propose des API de formatage de l’heure indépendantes et sensibles aux paramètres régionaux qui sont meilleures, riches en fonctionnalités et plus intuitives. Dans PHP 8.1 et versions ultérieures, strftime
et gmstrftime
sont obsolètes et leur utilisation génère un avis d’obsolescence. Ces fonctions seront supprimées dans PHP 9.0.
strftime('%D');
gmstrftime('%D');
PHP Deprecated: Function strftime() is deprecated in ... on line ...
PHP Deprecated: Function gmstrftime() is deprecated in ... on line ...
Solution
Pour un formatage de date/heure en PHP compatible avec les paramètres régionaux, utilisez IntlDateFormatter::format
(nécessite l’extension Intl
).
Dans un cas d’utilisation réel et idéal, l’objet IntlDateFormatter
est instancié une fois en fonction des informations de paramètres régionaux de l’utilisateur, et l’instance d’objet peut être utilisée chaque fois que nécessaire.
setlocale(LC_TIME, "fr_FR");
echo strftime('%x', time());
// DEVIENT
$formatter = new IntlDateFormatter('fr_FR', IntlDateFormatter::LONG, IntlDateFormatter::NONE);
echo $formatter->format(time());
Pour un formatage de date/heure indépendant des paramètres régionaux, utilisez la fonction date()
ou DateTime::format / DateTimeImmutable::format
. Notez que cela peut entraîner des formats d’heure différents sur les applications qui s’appuyaient sur setlocale
pour définir le format. La définition explicite du format de date peut remédier à cela.
setlocale(LC_TIME, "fr_FR");
// DEVIENT
echo strftime('%F', time());
echo date('d-m-Y', time());
DateTimeImmutable::format
peut également formater un objet DateTimeImmutable
:
setlocale(LC_TIME, "fr_FR");
echo strftime('%F', time());
// DEVIENT
$date = DateTimeImmutable::createFromFormat('U', time());
echo $date->format('d-m-Y');
Voila, vous pouvez maintenant briller en soirée …
Formations de Develop4fun
- Parcours pour devenir un programmeur web
- Créez vos jeux avec UNITY3D
- Parcours pour devenir un programmeur de jeux vidéo
- Apprenez à créer des jeux 2D facilement avec LUA et LÖVE 2D
- Parcours pour devenir un programmeur de jeux vidéo
- Apprenez à programmer en C#
- Apprenez à programmer en C++
- Formation WordPress : le cours complet
5 Commentaires
Bonjour
Avec la version 8.1 de PHP, strftime() est obsolète, connaissez-vous une alternative ?
Bonjour Nicolas,
Oui, à la place on peut utiliser IntlDateFormatter::format.
Je vais mettre à jour l’article !
Antonella
toujours pas a jour malheureusement
C’est fait 🙂
Bonne lecture !
Bonjour, j’essaye en vain d’afficher la date en francais mais ca coince.
setlocale(LC_TIME, ‘fr_FR’);
date_default_timezone_set(‘Europe/Paris’);
echo « Nous sommes le « ;
$now = date(« D-d-M »);
echo $now;
ca me donne: Nous sommes le Tue-09-May
merci d’avance.