8722 sujets

Développement web côté serveur, CMS

Bonjour à tous,

j'avais créé une classe en récupérant un exemple trouvé sur le net afin d'afficher les mois et les jours en français.


// pour afficher dates en français dans php
class DateTimeFrench extends DateTime {
  public function format($format) {
    $english_days   = array('Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 
    	'Saturday', 'Sunday');
    $french_days    = array('Lundi', 'Mardi', 'Mercredi', 'Jeudi', 'Vendredi', 
    	'Samedi', 'Dimanche');

    $english_months = array('January', 'February', 'March', 'April', 'May', 'June', 
    	'July', 'August', 'September', 'October', 'November', 'December');
    $french_months  = array('Janvier', 'Février', 'Mars', 'Avril', 'Mai', 'Juin', 
    	'Juillet', 'Août', 'Septembre', 'Octobre', 'Novembre', 'Décembre');

    return str_replace(
			$english_months, 
			$french_months, 
			str_replace($english_days, $french_days, parent::format($format))
		);
  }
}  // fin classe DateTimeFrench



ça fonctionne parfaitement avec PHP 7.4 mais quand je fais des essais avec PHP 8.1 il m'envoie un message d'erreur que je trouve incompréhensible...

Deprecated: Return type of DateTimeFrench::format($format) should either be compatible with DateTime::format(string $format): string, or the #[\ReturnTypeWillChange] attribute should be used to temporarily suppress the notice in W:\www\ortho-project\classes\Texte.php on line 37

là j'avoue que je sèche... Smiley rolleyes
Modérateur
Salut Lionel,

Je passe en coup de vent. En ce moment, je suis affairé.

Le message est explicite... c'est déprécié.... Je ne vois pas vraiment l'intérêt de surcharger pour afficher la date en Français. Demain, tu dois l'afficher dans une autre langue, comment vas tu faire ?


bon sinon, il y a plus simple :

<?php
setlocale(LC_ALL, 'fr_FR.UTF-8'); // bien faire attention à l'encodage et à  la locale
echo strftime("%A %e %B %Y", time()); // affiche jeudi 14 septembre 2023
?>


En Python, tu as quasiment le même équivalent

import locale
from datetime import datetime


locale.setlocale(locale.LC_ALL, 'fr_FR.utf8')
print(datetime.now().strftime('%A %d %B %Y'))


ps : cmd Linux Smiley cligne

$locale -a

Modifié par niuxe (14 Sep 2023 - 01:29)
niuxe a écrit :
Salut Lionel,

Je passe en coup de vent. En ce moment, je suis affairé.

Le message est explicite... c'est déprécié.... Je ne vois pas vraiment l'intérêt de surcharger pour afficher la date en Français. Demain, tu dois l'afficher dans une autre langue, comment vas tu faire ?


bon sinon, il y a plus simple :

&lt;?php
setlocale(LC_ALL, 'fr_FR.UTF-8'); // bien faire attention à l'encodage et à  la locale
echo strftime("%A %e %B %Y", time()); // affiche jeudi 14 septembre 2023
?&gt;



ah ok, merci pour ton aide je vais expérimenter ça, mais c'est quoi qui est déprécié? le fait d'étendre la classe DateTime ?

J'avoue que j'ai un peu de mal avec les fonctions de date en PHP
Salut,

le code de Niuxe m'a l'air plus propre que ton code, mais ça ne réponds pas vraiment à ton problème et tu l'auras sans doute sur d'autres bouts de code.

J'ai seulement regardé de très loin php8 pour le moment donc je dis peut être n'importe quoi, mais a priori cela introduit des notions de 'type' plus poussés qu'avant (on peut faire des mélanges pour limiter à certains types par exemple).

De ce que je comprends de ça "should be compatible with DateTime::format(string $format): string" c'est que tu devrais avoir le même type de retour que la classe que tu surcharges alors que tu n'en précise pas dans ton code. Je n'ai pas testé mais je pense que tu devrais changer la première ligne par la 2e :

  public function format($format) {
  public function format($format) : string {


Bon courage
Meilleure solution
Mathieuu a écrit :
Salut,
c'est que tu devrais avoir le même type de retour que la classe que tu surcharges alors que tu n'en précise pas dans ton code. Je n'ai pas testé mais je pense que tu devrais changer la première ligne par la 2e :

  public function format($format) {
  public function format($format) : string {



Super !!!
c'était ça, ça a corrigé l'erreur..... merci à toi.

Mais je vais quand même jeter un coup d'oeil à la solution de Niuxe... c'est vrai que c'est plus propre.

Mais j'ai encore d'autres erreurs qui s'affichent pour d'autres problèmes Smiley cligne
Modifié par lionel_css3 (14 Sep 2023 - 17:43)
Modérateur
Bonsoir lionel,

Du coup j'ai refait une petite fonction que tu peut tester sur ton hébergement en passant en paramètre différente dates et différents langages :
function showLocalDate($lang='fr',$dateString='05-10-2023'){
	if(class_exists('IntlDateFormatter')) {
		// Créer un objet DateTime à partir de la chaîne de date
		$date = DateTime::createFromFormat('d-m-Y', $dateString);			
		// Vérifier si la création de l'objet DateTime a réussi
		if ($date !== false) {
			// Formater la date en français à l'aide de la classe IntlDateFormatter
			$formatter = new IntlDateFormatter($lang, IntlDateFormatter::FULL, IntlDateFormatter::NONE);
			$formatter->setPattern('EEEE dd MMMM y');		
			$formattedDate = $formatter->format($date);		
			// Afficher la date traduite
			return $formattedDate;  
			} else {
			// Affiche la chaine passée par défaut
			return $dateString;
		}
	}
	else {
		return 'Il y a un bug ou bien ? requiert php >=5.3.0 , 7 ou 8';// ou utiliser  str_replace ou similaire dans une fonction maison, cas improbable 
	}
}	
	echo '<p>'.showLocalDate().'</p>';// affiche les valeurs par défaut des variables 05-10-2023 en Français	depuis l'appel de la fonction
	echo '<p>'.showLocalDate('en','25-12-1980').'</p>';//anglais
	echo '<p>'.showLocalDate('es','15-06-2021').'</p>';//espagnol
	echo '<p>'.showLocalDate('ru','07-12-1999').'</p>';//russe
	echo '<p>'.showLocalDate('he','08-07-2018').'</p>';//hebrew
	echo '<p>'.showLocalDate('ar','08-07-2018').'</p>';//arabic
	echo '<p>'.showLocalDate('fr',date('d-m-y')).'</p>';//french
	echo '<p>'.showLocalDate('fr',date_format(new DateTime('-1 days'), 'd-m-y')).'</p>';//french but yesterday
	echo '<p>'.showLocalDate('fr',date_format(new DateTime('+1 days +1 month'), 'd-m-y')).'</p>';//french next month + 1 day

?>


J'ai tester la fonction sous php7 et php 8 dans une page encodé en utf8. Cela fonctionne à priori correctement. Vous pouvez effectuer d'autres tests à partir de showLocalDate() et indiquez si il y a des défauts ou incohérences.

* la class testée et utilisée: https://www.php.net/manual/fr/class.intldateformatter.php

* liste de code langage que tu peut tester : https://www.w3schools.com/tags/ref_language_codes.asp

* Les différents masques, pattern de formatages de la fonction setPattern() https://unicode-org.github.io/icu/userguide/format_parse/datetime/ - fonctions associées https://www.php.net/manual/fr/intldateformatter.setpattern.php - https://www.php.net/manual/fr/intldateformatter.getpattern.php

Merci de ta question, car j'avais eu ce besoin et chercher il y a pas longtemps , cela commençais à redevenir mystérieux Smiley cligne Les dates en php, c'est l'enfer et j'ai passé quelques heures à réussir à sortir simplement le mois en Français !
Je reviendrais surement moi-même sur ta question dans le futur Smiley cligne

Cdt
Modifié par gcyrillus (14 Sep 2023 - 20:01)
Modérateur
gcyrillus a écrit :

...
Les dates en php, c'est l'enfer
...


Pour les dates, il y a une bonne lib en php : carbon