¿Cuáles son alternativas a strftime?

Resuelto
emrh Mensajes publicados 439 Estado Miembro -  
emrh Mensajes publicados 439 Estado Miembro -

Hola,

Necesito mostrar la fecha con el nombre del día en francés... Encontré esto que funciona muy bien:

setlocale(LC_TIME, 'fr_FR.utf8','fra'); $aujourdhui = ucwords(strftime('%A %d %B %Y')); Aujourd'hui : <?php echo $aujourdhui;?> 

Resultado: Aujourd'hui : Dimanche 17 Juillet 2022

Por otro lado acabo de leer en PHP.net sobre strftime: "Esta función está OBSOLETA a partir de PHP 8.1.0. Se recomienda evitarla fuertemente."

¿Cuál sería la alternativa a esta instrucción para obtener exactamente el mismo resultado?
He probado un montón de cosas desde date() pero no consigo nada que coincida con la sintaxis buscada...

¡Gracias de antemano por vuestra ayuda!

3 respuestas

Pitet Mensajes publicados 2845 Estado Miembro 530
 

Bonjour,

Préfère l'utilisation des classes DateTime et DateInterval pour manipuler les dates en PHP.
Comme indiqué sur la doc, une alternative est d'utiliser la classe IntlDateFormatter.
Tu peux utiliser les constantes prédéfinies de cette classe (LONG, SHORT, RELATIVE_FULL, ...) pour le format de la date et l'heure à l'instanciation (2e et 3e paramètre).
https://www.php.net/manual/fr/class.intldateformatter.php#intl.intldateformatter-constants

Tu peux aussi définir un format personnalisé avec la méthode setPattern.
https://www.php.net/manual/fr/intldateformatter.setpattern.php

<?php $aujourdhui = new DateTime(); $formatter = new IntlDateFormatter('fr_FR', IntlDateFormatter::FULL, IntlDateFormatter::NONE); echo $formatter->format($aujourdhui); // dimanche 17 juillet 2022 $formatter->setPattern('EEEE d MMMM y'); echo ucwords($formatter->format($aujourdhui)); // Dimanche 17 Juillet 2022 
2
Usuario anónimo
 

Hola, gracias por el ejemplo. Como el autor, tenía previsto enfocarme en este cambio; voy a guardar tu snippet en un rincón.

Que tengas un buen día :).

0
emrh Mensajes publicados 439 Estado Miembro 20
 

Hola Pitet,
Gracias por tu ayuda...

Pero tengo este mensaje de error:

Error fatal: Uncaught Error: Class 'IntlDateFormatter' not found in /var/www/html/gite/gestion/accueil.php:78 Stack trace: #0 {main} thrown in /var/www/html/gite/gestion/accueil.php on line 78

Por otra parte, si hago un copiar/pegar en mi código de
class IntlDateFormatter {
..../....
public setTimeZone(IntlTimeZone|DateTimeZone|string|null $timezone): ?bool
}

Tengo esto:
Parse error: syntax error, unexpected '(', expecting variable (T_VARIABLE) in /var/www/html/gite/gestion/accueil.php on line 78

Mis líneas 76 a 85

class IntlDateFormatter { /* Méthodes */ public __construct( ?string $locale, int $dateType = IntlDateFormatter::FULL, int $timeType = IntlDateFormatter::FULL, IntlTimeZone|DateTimeZone|string|null $timezone = null, IntlCalendar|int|null $calendar = null, ?string $pattern = null )

Pero una cosa me preocupa de verdad: ¿Tendrá que copiar todo este galimatías para reemplazar mis 2 líneas iniciales?

0
Pitet Mensajes publicados 2845 Estado Miembro 530
 

No hace falta redefinir la clase, hay que activar la extensión PHP Intl.

¿En qué entorno desarrollas? Si estás en Windows con un software como WampServer o Laragon, la extensión Intl suele estar presente pero no activada; basta, en general, descomentar la línea extension=intl en el archivo php.ini y reiniciar el servidor (también deberías poder activar la extensión desde la interfaz de herramientas de WampServer/Laragon/etc.). Si estás en Linux, deberías poder encontrar fácilmente la información para activar esta extensión según tu distribución.

0
emrh Mensajes publicados 439 Estado Miembro 20
 

Efectivamente, acabo de transferir la página.php correspondiente a Ionos y tu código funciona perfectamente!
(Voy a echar un vistazo a mi archivo php.ini, estoy en Linux con servidor local).

Muchas gracias, voy a adoptar tu código para evitar que el mío quede obsoleto!

:-)

0
emrh Mensajes publicados 439 Estado Miembro 20
 

Bajo Linux:

sudo apt-get install php7.4-intl               (7.4 para mí)
sudo service apache2 restart

1