Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

probleme de formatage de date..

13 réponses
Avatar
samuel
bonjour, j'ai écrit une petite fonction que voici:

function fdate($t){
$jours_fr = array('dimanche ','lundi ', 'mardi ', 'mercredi ', 'jeudi
', 'vendredi ', 'samedi ');
$mois_fr = array('janvier', 'février', 'mars', 'avril', 'mai', 'juin',
'juillet', 'août', 'septembre', 'octobre', 'novembre', 'décembre');

$jour = $jours_fr[date('w',$t)].' ';
$jour2= date('j',$t);if ($jour2==1) {$jour2='1<sup>er</sup>';}
$mois = $mois_fr[date('n',$t)-1];
$annee=date('Y',$t);

return $jour.$jour2.' '.$mois.' '.$annee;
}

Alors, le test suivant est plutôt concluant:
echo fdate(mktime(0, 0, 0, 5, 10, 2009));



mais par contre dans ma boucle qui recupère des timestamps de mysql,
ça va pas:
else{$retour = mysql_query("SELECT titre,accroche,article,date FROM
article1 ORDER BY date DESC LIMIT 0,4")or die(mysql_error());}

while ($donnees = mysql_fetch_array($retour)){
echo '<h2>'.$donnees['titre'].' <em>('.fdate($donnees['date']).')</
em></h2>
<span class="accroche">'.$donnees['accroche'].'</span>
<p>'.$donnees['article'].'</p>
<div id="navig"><a href="comms.php?ch=1&id='.''.'">Commentaires
('.''.')</a></div>';
}

il maffiche tjs le 1jan.70..
pourtant la date est pas vide, car echo $donnees['date'] me donne un
truc pas mal..
comprends pas :s

merci de votre aide!

10 réponses

1 2
Avatar
Olivier Miakinen
Le 10/05/2009 20:11, samuel a écrit :

[...]

Alors, le test suivant est plutôt concluant:
echo fdate(mktime(0, 0, 0, 5, 10, 2009));



mktime retourne un « timestamp », c'est-à-dire un entier qui contient le
nombre de secondes depuis le 1er janvier 1990.

mais par contre dans ma boucle qui recupère des timestamps de mysql,
ça va pas:
[...] fdate($donnees['date']) [...]

il maffiche tjs le 1jan.70..
pourtant la date est pas vide, car echo $donnees['date'] me donne un
truc pas mal..



Un « truc pas mal » en entrée de ta fonction fdate, ça doit être une
entier dont l'ordre de grandeur est 1241982136... si c'est ça que tu as
estimé à vue de nez comme étant un truc pas mal, alors tu es un génie
des nombres. Si au contraire tu as vu un truc qui ressemblait plus à
« 2009/05/10 21:02:04 », alors c'est normal que fdate() n'y ait rien
compris...

comprends pas :s



Pour compléter l'explication : la conversion implicite de PHP des
chaînes en entiers aura converti « 2009/05/10 21:02:04 » en l'entier
2009, la date correspondante étant alors 2009 secondes après le début
des temps, soit donc le 1er janvier 1970 à 1 h 33 mn 29 s.
Avatar
samuel
On 10 mai, 21:53, Olivier Miakinen <om+ wrote:
Le 10/05/2009 20:11, samuel a écrit :



> [...]

> Alors, le test suivant est plutôt concluant:
> echo fdate(mktime(0, 0, 0, 5, 10, 2009));

mktime retourne un « timestamp », c'est-à-dire un entier qui contient le
nombre de secondes depuis le 1er janvier 1990.

> mais par contre dans ma boucle qui recupère des timestamps de mysql,
> ça va pas:
> [...] fdate($donnees['date']) [...]

> il maffiche tjs le 1jan.70..
> pourtant la date est pas vide, car echo $donnees['date'] me donne un
> truc pas mal..

Un « truc pas mal » en entrée de ta fonction fdate, ça doit être une
entier dont l'ordre de grandeur est 1241982136... si c'est ça que tu as
estimé à vue de nez comme étant un truc pas mal, alors tu es un génie
des nombres.



me flatte pas comme ça :$

Si au contraire tu as vu un truc qui ressemblait plus à
« 2009/05/10 21:02:04 », alors c'est normal que fdate() n'y ait rien
compris...

> comprends pas :s

Pour compléter l'explication : la conversion implicite de PHP des
chaînes en entiers aura converti « 2009/05/10 21:02:04 » en l'entier
2009, la date correspondante étant alors 2009 secondes après le début
des temps, soit donc le 1er janvier 1970 à 1 h 33 mn 29 s.



daccord, c'est bien ce qui me semblait au début...
j'ai bien plutôt un truc du genre : 2009/05/10 21:02:04 qu'un vrai de
vrai timestamp...
mais comment ça se fait? ds ma base j'ai pourtant :


CREATE TABLE `article1` (
`id` int(11) NOT NULL auto_increment,
`titre` varchar(50) collate latin1_general_ci NOT NULL,
`accroche` tinytext collate latin1_general_ci NOT NULL,
`article` text collate latin1_general_ci NOT NULL,
`labels` enum('tamil nadu','lala') collate latin1_general_ci NOT
NULL,
`date` timestamp NOT NULL default CURRENT_TIMESTAMP on update
CURRENT_TIMESTAMP,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci
AUTO_INCREMENT ;

en tout cas, woaw, cest rapide ici, merci =)
Avatar
Olivier Miakinen
Le 11/05/2009 00:55, samuel a écrit :

j'ai bien plutôt un truc du genre : 2009/05/10 21:02:04 qu'un vrai de
vrai timestamp...
mais comment ça se fait? ds ma base j'ai pourtant :

CREATE TABLE `article1` (
[...]
`date` timestamp NOT NULL default CURRENT_TIMESTAMP on update
CURRENT_TIMESTAMP,
[...]



Je ne suis pas un spécialiste de MySQL, d'ailleurs ma réponse serait
plus en charte sur f.c.a.sgbd que sur f.c.l.php, mais je crois que par
défaut MySQL traduit la date en chaîne quand tu ne précises rien. En
revanche, si tu demandes en SQL « (0 + la date) » ou un truc de ce
genre, il y a des chances que ça fonctionne si j'en crois ceci :

<http://dev.mysql.com/doc/refman/5.0/fr/date-and-time-types.html>
MySQL convertit automatiquement une date ou heure en nombre si la valeur
est utilisée dans un contexte numérique et vice versa.
</>

Si jamais ça ne marchait pas, tu peux aussi essayer cela :

<http://dev.mysql.com/doc/refman/5.0/fr/date-and-time-functions.html>
UNIX_TIMESTAMP(), UNIX_TIMESTAMP(date)
Lorsqu'elle est appelé sans argument, cette fonction retourne un
timestamp Unix (nombre de secondes depuis '1970-01-01 00:00:00' GMT). Si
UNIX_TIMESTAMP() est appelé avec un argument date, elle retourne le
timestamp correspondant à cette date.
</>

Et pour plus d'infos sur le vrai format de la requête, je propose un
suivi vers fr.comp.applications.sgbd.

Cordialement,
--
Olivier Miakinen
Avatar
Olivier Miakinen
Le 11/05/2009 00:55, samuel a écrit :

j'ai bien plutôt un truc du genre : 2009/05/10 21:02:04 qu'un vrai de
vrai timestamp...
mais comment ça se fait? ds ma base j'ai pourtant :

CREATE TABLE `article1` (
[...]
`date` timestamp NOT NULL default CURRENT_TIMESTAMP on update
CURRENT_TIMESTAMP,
[...]



Je ne suis pas un spécialiste de MySQL, d'ailleurs ma réponse serait
plus en charte sur f.c.a.sgbd que sur f.c.l.php, mais je crois que par
défaut MySQL traduit la date en chaîne quand tu ne précises rien. En
revanche, si tu demandes en SQL « (0 + la date) » ou un truc de ce
genre, il y a des chances que ça fonctionne si j'en crois ceci :

<http://dev.mysql.com/doc/refman/5.0/fr/date-and-time-types.html>
MySQL convertit automatiquement une date ou heure en nombre si la valeur
est utilisée dans un contexte numérique et vice versa.
</>

Si jamais ça ne marchait pas, tu peux aussi essayer cela :

<http://dev.mysql.com/doc/refman/5.0/fr/date-and-time-functions.html>
UNIX_TIMESTAMP(), UNIX_TIMESTAMP(date)
Lorsqu'elle est appelé sans argument, cette fonction retourne un
timestamp Unix (nombre de secondes depuis '1970-01-01 00:00:00' GMT). Si
UNIX_TIMESTAMP() est appelé avec un argument date, elle retourne le
timestamp correspondant à cette date.
</>

Et pour plus d'infos sur le vrai format de la requête, je propose un
suivi vers fr.comp.applications.sgbd.

Cordialement,
--
Olivier Miakinen
Avatar
Sylvain SF
samuel a écrit :

daccord, c'est bien ce qui me semblait au début...
j'ai bien plutôt un truc du genre : 2009/05/10 21:02:04 qu'un vrai de
vrai timestamp...



et tu le passes quand même à date(int) ?!

mais comment ça se fait? ds ma base j'ai pourtant :

CREATE TABLE `article1` (
`date` timestamp NOT NULL default CURRENT_TIMESTAMP on update
CURRENT_TIMESTAMP,
);



1- "date timestamp default null" doit donner le même résultat,
puisque NULL assigne la date/heure courante.

2- le type timestamp ('1970-01-01 00:00:01' à '2038-01-09 03:14:07')
est plus réduit que date ('1000-01-01 00:00:00' à '9999-12-31 23:59:59')
car il compte les secondes depuis l'epoch (1-1-1970 0:0:0) pour
autant le serveur MySQL retourne ces 2 type comme des chaînes
"yyyy/mm/dd hh:mm:ss"

donc:

solution 1:
$dateStr = $donnees['date'];
$stamp = mktime(
substr($dateStr, 11, 2),
substr($dateStr, 14, 2),
substr($dateStr, 17, 2),
substr($dateStr, 5, 2),
substr($dateStr, 8, 2),
substr($dateStr, 0, 4));
printf( fdate( $stamp ));

solution 2:
SELECT UNIX_TIMESTAMP(date) FROM article1
à la place de
SELECT date FROM article1
puis
printf( fdate( $donnees['date'] ));

Sylvain.
Avatar
samuel
On 11 mai, 01:58, Sylvain SF wrote:

solution 2:
        SELECT UNIX_TIMESTAMP(date) FROM article1
à la place de
        SELECT date FROM article1




la solution 2 marche pas, je me contente de la 1, même si j'aime
moins...

merci à toi et à tous! :-)
joyeux anniversaire
Avatar
Sylvain SF
samuel a écrit :
On 11 mai, 01:58, Sylvain SF wrote:

solution 2:
SELECT UNIX_TIMESTAMP(date) FROM article1
à la place de
SELECT date FROM article1




la solution 2 marche pas, je me contente de la 1, même si j'aime
moins...



"ne marche pas" est un peu court jeune homme.

est-ce la requête qui n'aboutit pas ?
(quelle est la version de MySQL utilisée?)

ou est-ce ta fonction "fdate" qui ne retourne pas le résultat attendu?
cela peut être le cas si la "time zone" n'est pas (ou mal) fixée.

les 2 points sont pertinents sur fr.c.appl.sgbd, suivi positionné.

Sylvain.
Avatar
Sylvain SF
samuel a écrit :
On 11 mai, 01:58, Sylvain SF wrote:

solution 2:
SELECT UNIX_TIMESTAMP(date) FROM article1
à la place de
SELECT date FROM article1




la solution 2 marche pas, je me contente de la 1, même si j'aime
moins...



"ne marche pas" est un peu court jeune homme.

est-ce la requête qui n'aboutit pas ?
(quelle est la version de MySQL utilisée?)

ou est-ce ta fonction "fdate" qui ne retourne pas le résultat attendu?
cela peut être le cas si la "time zone" n'est pas (ou mal) fixée.

les 2 points sont pertinents sur fr.c.appl.sgbd, suivi positionné.

Sylvain.
Avatar
Antoine Polatouche
samuel a écrit :
bonjour, j'ai écrit une petite fonction que voici:

function fdate($t){
$jours_fr = array('dimanche ','lundi ', 'mardi ', 'mercredi ', 'jeudi
', 'vendredi ', 'samedi ');
$mois_fr = array('janvier', 'février', 'mars', 'avril', 'mai', 'juin',
'juillet', 'août', 'septembre', 'octobre', 'novembre', 'décembre');

$jour = $jours_fr[date('w',$t)].' ';
$jour2= date('j',$t);if ($jour2==1) {$jour2='1<sup>er</sup>';}
$mois = $mois_fr[date('n',$t)-1];
$anneeÚte('Y',$t);

return $jour.$jour2.' '.$mois.' '.$annee;
}



On peut aussi demander à mySQL de faire le boulot:
(MySQL 5.0.25 +)

mysql_query("SET NAMES 'utf8'");// (selon la sortie voulue)
mysql_query("SET lc_time_names = 'fr_FR'");
$res = mysql_query(
"SELECT DATE_FORMAT('2009-02-1','%W %e %M %Y %kh %imn %ss')"
);
$row = mysql_fetch_assoc($res);
echo('<pre>');
print_r($row);
echo('</pre>');


avec un str_replace(' 1 ',' 1<sup>er</sup> ', $ladate) pour peaufiner.

dans la doc mySQL:

5.10.9. MySQL Server Locale Support
Beginning with MySQL 5.0.25, the locale indicated by the lc_time_names
system variable controls the language used to display day and month
names and abbreviations. This variable affects the output from the
DATE_FORMAT(), DAYNAME() and MONTHNAME() functions.

Locale names are POSIX-style values such as 'ja_JP' or 'pt_BR'. The
default value is 'en_US' regardless of your system's locale setting, but
any client can examine or set its lc_time_names value
Avatar
samuel
On 12 mai, 00:31, Sylvain SF wrote:
samuel a écrit :

> On 11 mai, 01:58, Sylvain SF wrote:

>> solution 2:
>>         SELECT UNIX_TIMESTAMP(date) FROM article1
>> à la place de
>>         SELECT date FROM article1

> la solution 2 marche pas, je me contente de la 1, même si j'aime
> moins...

"ne marche pas" est un peu court jeune homme.

est-ce la requête qui n'aboutit pas ?
(quelle est la version de MySQL utilisée?)


cest ça

5.051

Sylvain.



5.051
1 2