• Votre panier est vide.

Afficher la date du jour en français avec PHP

(Dernière mise à jour: 6 juillet 2022)

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 format DATETIME)
  • 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 que IntlDateFormatter::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

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 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 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');

4 responses on "Afficher la date du jour en français avec PHP"

  1. Bonjour

    Avec la version 8.1 de PHP, strftime() est obsolète, connaissez-vous une alternative ?

  2. toujours pas a jour malheureusement

Leave a Message

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.

© Develop4fun. Tous les droits réservés.