[RESOLU] strftime()

Avatar du membre
Eléphant du PHP | 60 Messages

16 janv. 2024, 17:32

Bonjour,
Je viens de remettre la main sur un de mes vieux site et j'ai un problème d'adaptation avec la fonction strftime()
Je n'arrive pas du tout malgré mes recherche à adapter ce script à php 8.1

Code : Tout sélectionner

function jour_date($ladate) { if (strftime("%d %m %Y", time()) == strftime("%d %m %Y", $ladate)) $ladate = "Aujourd'hui à " . strftime("%H:%M", $ladate); else if (strftime("%d", $ladate) == (strftime("%d", time()) - 1) && strftime("%m %Y", time()) == strftime("%m %Y", $ladate)) $ladate = "Hier à " . strftime("%H:%M", $ladate); else $ladate = strftime('Le %d/%m/%Y à %H:%M', $ladate); return $ladate; }
Je vous remercie d'avance pour l'aide.

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9782 Messages

16 janv. 2024, 17:59

Bonjour,

C'est mieux d'indiquer le message d'erreur que tu rencontres et ce que tu as testé pour corriger le problème.

Moi je serai toi, je changerai mon code pour utiliser la fonction date() ou date_format()
https://www.php.net/manual/fr/function.date.php
https://www.php.net/manual/fr/datetime.format.php

A défaut, il existe une petite librairie qui rend fonctionnel la fonction strftime() sur les versions + récentes de PHP :
https://github.com/alphp/strftime
Mais il est préférable de mettre à jour ton code.
Quand tout le reste a échoué, lisez le mode d'emploi...

Avatar du membre
Eléphant du PHP | 60 Messages

16 janv. 2024, 19:00

Bonjour et merci pour la réponse.
J'ai essayé les fonctions date() et datetime.format mais je dois me tromper au niveau de la syntaxe car ça ne fonctionne pas.
Quant à la petite librairie je ne suis pas suffisamment calé pour arriver à l'intégrer correctement.
Sinon j'ai essayé de remplacer strftime() par date() et en supprimant les %.

Avatar du membre
Mammouth du PHP | 1564 Messages

17 janv. 2024, 00:08

IL te faut échapper les lettres dans le 1er paramètre de la fonction date() sinon il essaye de les convertir : '\L\e d/m/Y \à H:i'

J'ai également remplacé H:M par H:i.

J'ai également fait des "return" directement plutôt que de l'assigner à une variable retournée en fin de fonction.

La date envoyé à la fonction doit être un TIMESTAMP. SI tu veux envoyer un format "06/01/2024" il te faudra d'abord passer $ladate avec strtotime() avant de l'envoyer dans les date().
function jour_date($ladate){
	
	if(date("d-m-Y", time()) == date("d-m-Y", $ladate))
		return "Aujourd'hui à " . date("H:i", $ladate);
	
	else if(date("d", $ladate) == (date("d", time()) - 1) && date("m-Y", time()) == date("m-Y", $ladate))
		return "Hier à " . date("H:i", $ladate);

	return date('\L\e d/m/Y \à H:i', $ladate);
	
}

var_dump(jour_date(time()));//Aujourd'hui à ...
var_dump(jour_date(time() - 86400));//Hier à ...
var_dump(jour_date(time() - 864000));//Le ... à ...

Avatar du membre
Eléphant du PHP | 60 Messages

17 janv. 2024, 10:48

Bonjour et merci.
J'ai mis le code ci-dessus mais ça ne fonctionne toujours pas.
Voici le message d'erreur que j'ai :

Code : Tout sélectionner

Fatal error: Uncaught TypeError: date(): Argument #2 ($timestamp) must be of type ?int, string given in /home/vol15_7/byethost14.com/b14_29615537/phenixptp.fast-page.org/htdocs/core.php:233 Stack trace: #0 /home/vol15_7/byethost14.com/b14_29615537/phenixptp.fast-page.org/htdocs/core.php(233): date('d-m-Y', '') #1 /home/vol15_7/byethost14.com/b14_29615537/phenixptp.fast-page.org/htdocs/compte/accueil.php(13): jour_date('') #2 /home/vol15_7/byethost14.com/b14_29615537/phenixptp.fast-page.org/htdocs/compte/index.php(37): include('/home/vol15_7/b...') #3 {main} thrown in /home/vol15_7/byethost14.com/b14_29615537/phenixptp.fast-page.org/htdocs/core.php on line 233

Avatar du membre
Mammouth du PHP | 1564 Messages

17 janv. 2024, 11:47

L'erreur parle d'elle même. "Le format du timestamp doit être un int (entier), pas une chaine de caractère."

Avatar du membre
Eléphant du PHP | 60 Messages

17 janv. 2024, 12:10

oui , mais comment corriger l'erreur ? Et à quel endroit ?
Merci d'avance car là je nage complètement et le pire c'est que je suis sûre que c'est tout simple.

Avatar du membre
Mammouth du PHP | 1564 Messages

17 janv. 2024, 12:33

D'après l'erreur, ton code envoi une chaine vide à un moment donné, il te faut voir où et ne pas envoyer de chaine vide à ce moment ou ne pas appeler la fonction jour_date() quand la chaine est vide.

ynx
Mammouth du PHP | 586 Messages

17 janv. 2024, 14:08

Bonjour,

A priori tu utilises le typage strict pour ton script.
Tu peux convertir le type des variables en utilisant le casting : https://www.php.net/manual/fr/language. ... ypecasting

Tu peux éventuellement convertir le paramètre $ladate en integer dans ta fonction :
function jour_date($ladate) {
    $ladate = (int) $ladate;
    // ...

Il serait p-e mieux de définir le type du paramètre en int pour ta fonction et faire la conversion lors de l'utilisation de cette fonction :
$timestamp = (int) '1705493019';
echo jour_date($timestamp);

function jour_date(int $ladate) {
    // ...

Avatar du membre
Eléphant du PHP | 60 Messages

18 janv. 2024, 14:25

bonjour ynx ,
Merci pour la réponse, ça fonctionne.