Problème de formattage de date

Petit nouveau ! | 5 Messages

29 août 2012, 15:20

Bonjour,

Je n'y connais pas grand chose à PHP et j'ai un problème avec une fonction qui formatte la date.
Elle fonctionne trés bien sur plusieurs serveurs.

Je suis sur une machine en : white box linux release 4 32bit PHP 5.2.12.

Voilà la fonction (je l'ai remis dans une simple page) :

<?php
$s_date="29-08-2012";
$day = strtok($s_date, '-');
$month = strtok('-');
$year = strtok('-');
$tsp1= mktime(0,0,0, $month, $day+1, $year);
$sFormat=($sFormat=="")?"d-M-y":$sFormat;
$result1=gmdate( $sFormat,$tsp1);
print_r($tsp1." ".$result1."</pre>");
?>

En entrée je donne la date d'aujourd'hui, et il m'affiche bien "29 08 2012"
En sortie, il m'affiche "30-Aug-12"
Je vois bien que la fonction est un peu "bête" et que l'on peut certainement écrire cela autrement.

J'espère vous donner suffisamment d'infos.

Avez-vous une idée de l'origine du problème ?

D'avance merci pour votre aide.

Eléphant du PHP | 229 Messages

29 août 2012, 15:54

Bonjour,

"d-M-y" a changer en, si tu veux modifier le format de la date. Attention à la casse.

http://php.net/manual/fr/function.date.php

Bon codage.

Petit nouveau ! | 5 Messages

29 août 2012, 16:06

Bonjour Schim59,

En utilisant "d-M-y", il me retourne bien le format :
jour sur 2 chiffres,
mois sur 3 lettres (en anglais),
année sur 2 chiffres.

Le problème n'est pas sur le format mais sur la valeur : je donne le 29 en entrée et il me retourne le 30 en sortie ???

Merci pour ton aide.

Eléphant du PHP | 229 Messages

29 août 2012, 16:56

ah ok lol

$day+1 ???

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

29 août 2012, 17:31

salut,

utilise simplement la classe dateTime

tu pourras faire les calculs de date très simplement plus les changements de format.

sinon indiquer ce qui ne va pas clairement devrais nous aider à t'aider :)

@+
Il en faut peu pour être heureux ......

Petit nouveau ! | 5 Messages

30 août 2012, 08:27

Bonjour Moogli,

Il s'agit d'une application de plusieurs milliers de lignes, que je n'ai pas développé.
Seule cette fonction semble ne pas marcher correctement.
Il est certainement possible de l'écrire autrement mais ce n'est pas le but de mon post.

Pour indiquer clairement ce qui ne va pas :
C'est une fonction qui formatte la date,
En entrée je donne une date dans un format, en sortie je dois récupérer la MEME date dans un autre format,
Problème : la date est différente.
Exemple : 29-08-2012 en entrée, 30-Aug-12 en sortie.

Mes questions :
Pourquoi ?
Y a t'il des particularités sur les fonctions PHP (mktime, gmdate) ?
L'environnement système peut-il être à la source du problème ? La configuration PHP ?

Petit nouveau ! | 5 Messages

30 août 2012, 09:34

Une précision qui peut avoir son importance, au vue de ce que je lis sur le net : le serveur est à Dakar.

Peut être un problème d'heure GMT ? locale ?

Si cela peut vous aider.

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

30 août 2012, 12:58

comme schim59 te l'indique il y a un incrément sur la date ($day+1 sur le mktime)

prendre 2 minutes pour comprendre ton code t'aurais aidé
<?php
$s_date="29-08-2012"; // une date
$day = strtok($s_date, '-');// récupère ce qu'il y a avant le 1ère -
$month = strtok('-'); // le second
$year = strtok('-'); // le troisème
$tsp1= mktime(0,0,0, $month, $day+1, $year); // on créer un timestamp à partir des infos précédente, en ajoutant un jour
$sFormat=($sFormat=="")?"d-M-y":$sFormat; // format par défaut s'il n'existe pas déjà : la pour le coup variable $sFormat qui n'existe pas !
$result1=gmdate( $sFormat,$tsp1); // formate la date
print_r($tsp1." ".$result1."</pre>"); // affiche la date
?>
Le code fait donc bien ce que tu indique !

doc de strtok http://fr.php.net/strtok
doc de mktime http://fr.php.net/mktime
doc de gmdate http://fr.php.net/gmdate

Même sasns la classe datetime, utiliser les fonctions strftime et strtotime font la même chose en une ligne !
maintenant si le but est de changer le format de la date, des classes toutes faites existe pour cela, tu y gagne en lisibilité (moins de ligne de code, elles sont plus claires) et en efficacité (les classes / fonction natives sont plus rapide).


@+
Il en faut peu pour être heureux ......

Petit nouveau ! | 5 Messages

30 août 2012, 16:48

Moogli,

J'ai bien lu la remarque de Schim59. J'ai bien vu le "+1".

J'ai pris plus de 2 minutes pour comprendre LE code, car pas le mien et je n'y connais rien en PHP.

Merci pour les liens, j'ai déjà lu ces docs mais cela ne m'apporte pas de réponse.

J'essaye juste de comprendre pourquoi cela fonctionne sur nos serveurs en France et pas sur celui de Dakar.

As-tu une réponse à m'apporter sur ce point ?
Peut-il y avoir des différences de comportement en fonction de l'environnement ?

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

30 août 2012, 17:46

non le jour de plus est clairement stipulé dans le code.

au pire gmdate peu induire un décalage horaire (comme indiqué dans la doc) mais pas d'un jour (a priori ils sont à l'heure GMT et nous GMT +2 donc à part si tu test entre 22h et minuit ça ne doit pas arriver.

Est ce que les deux code sont indentique ?

est ce qu'il n'y a pas un 'rattrapage' quelque part ?

les 8 lignes de codes fournies induise un jour de plus la comme ça avec ces 8 lignes y a pas de raison que cela soit différent.

les configurations de serveur sont identique ? (même version de php ? avec la même conf).


@++
Il en faut peu pour être heureux ......