Discussion:
probleme de formatage de date..
(trop ancien pour répondre)
samuel
2009-05-10 18:11:10 UTC
Permalink
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!
Olivier Miakinen
2009-05-10 19:53:46 UTC
Permalink
Post by samuel
[...]
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.
Post by samuel
mais par contre dans ma boucle qui recupère des timestamps de mysql,
[...] 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...
Post by samuel
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.
samuel
2009-05-10 22:55:54 UTC
Permalink
Post by Olivier Miakinen
Post by samuel
[...]
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.
Post by samuel
mais par contre dans ma boucle qui recupère des timestamps de mysql,
[...] 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 à
Post by Olivier Miakinen
« 2009/05/10 21:02:04 », alors c'est normal que fdate() n'y ait rien
compris...
Post by samuel
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=20 ;

en tout cas, woaw, cest rapide ici, merci =)
Olivier Miakinen
2009-05-10 23:53:16 UTC
Permalink
Post by samuel
j'ai bien plutôt un truc du genre : 2009/05/10 21:02:04 qu'un vrai de
vrai timestamp...
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
Sylvain SF
2009-05-10 23:58:49 UTC
Permalink
Post by samuel
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) ?!
Post by samuel
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.
samuel
2009-05-11 19:46:20 UTC
Permalink
        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
Sylvain SF
2009-05-11 22:31:44 UTC
Permalink
Post by samuel
Post by Sylvain SF
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.
Antoine Polatouche
2009-05-11 22:31:44 UTC
Permalink
Post by samuel
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;
}
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

Continuer la lecture sur narkive:
Loading...