Format date en PHP/MySQL

Résolu
Bonjour,

J'ai développé, sous windows XP pro et EasyPHP 1.6, un livre d'or en php et base de données MySql, avec l'affichage de la date et l'heure de la création du message.
Tout fonctionne parfaitement, si ce n'est que la date s'affiche au format américain : AAAA/MM/JJ.
J'aurais souhaité l'afficher au format français : JJ/MM/AAAA.
Quelqu'un pourrait-il me dire comment faire ?

J'ai essayé de changer le format dans le formulaire
$date = date("Y-m-d");
$date = date("d-m-Y");
mais j'ai un autre problème lors de l'affichage de l'année qui reprend le jour et le mois, au lieu de 2004.

Dans phpMyAdmin je n'arrive pas à changer le format de la date qui revient toujours au format américain.

Voici les scripts du formulaire et de l'affichage :

FORMULAIRE :
<?php
include("sql.inc");
mysql_connect($hote, $user, $password);
mysql_select_db("perso")
or die("Ouverture base impossible");

$date = date("Y-m-d");
$heure = date("H:i:s");

if($nom)
{
mysql_query("INSERT INTO livre(nom,message,date,heure)
VALUES('$nom','$message','$date','$heure')")
or die("Ecriture impossible");
}
mysql_close;

?>

AFFICHAGE:
<?
include("sql.inc");
mysql_connect($hote, $user, $password);
mysql_select_db("perso")
or die("Ouverture base impossible");
{
$table=mysql_query("SELECT * FROM livre order by ordre DESC");
}
mysql_close;

echo"<CENTER><TABLE BORDER=0 bgcolor='#FFFFFF'>";
echo"<TR>";
echo"<TD><CENTER>";

while ($ligne=mysql_fetch_object($table))

{
echo"<TR>";
echo"<TD><CENTER><B>$ligne->message<BR><BR>";
echo"<TR>";
echo"<TD><B>$ligne->nom le $ligne->date à $ligne->heure";
echo"<BR><hr>";

}

?>

Merci d'avance pour vos réponses.

26 réponses

Résumé de la discussion

Le problème est que la date et l'heure s'affichent en format américain (AAAA/MM/JJ) dans un livre d'or PHP/MySQL, alors que le format français JJ/MM/AAAA est souhaité. Des solutions essentielles existent : transformer le format lors de l'affichage avec PHP et strtotime, ou faire parler MySQL via DATE_FORMAT lors des requêtes, ou stocker un timestamp et le reformater à l'affichage. En pratique, beaucoup recommandent d'afficher avec DATE_FORMAT sur la requête ou de convertir le format en PHP au moment de l'affichage, ce qui évite de modifier le format enregistré dans la base.

Bobot (l’IA à votre service)
  1. utilise strtotime
    du style : echo date("d/m/Y", strtotime($date1));
    121
    1. Parfait ! Tout simplement ...
      0
    2. Simple rapide et efficace ! j'ai surfé sur beaucoup de "solutions" avant de tomber sur cette solution ! MERCI PAT !
      0
    3. +20

      Même 4 ans après, ça m'a aidé ^^
      0
    4. Idem
      0
    5. Merciiiiii vous avez m' aidé moi aussi
      0
  2. Moi, une fois la date récupérée, tu utilise explode("-", $date) qui retourne maintenant un tableau contenant dans l'ordre l'année, le mois et le jour. Ensuite tu fais une concaténation dans l'odre que tu veux.
    Exemple
    $date='2007-12-23';
    $tab= explode("-", $date);
    $dateEnFrancais=$tab[2] . '/'.$tab[1] . '/'.$tab[0] ;

    voilà
    2
    1. $date = '2010/06/23' ;
      
      echo implode('/', array_reverse( explode('/',$date) ) ) ;
      17
      1. C exactement ça, nikel !
        Merci
        0
      2. Bien vu les différentes conversion (tableau et chaine de caractère)
        0
    2. Si je comprends bien, ton champs 'date' est de type VARCHAR et la valeur stockée dans ce champs est de type '01/05/2010 à 11:45' ?

      Dans ce cas :

      SELECT DATE_FORMAT(STR_TO_DATE( '01/05/2010 à 11:45', '%d/%m/%Y à %H:%i' ) , '%Y/%m/%d %H:%i' ) AS ma_date

      devrait fonctionner :-)
      0
      1. Petite question à la suite de ce sujet. Je touche au but mais n'arrive pas à l'atteindre.

        Mon champ "date" est en VARCHAR et non en DATETIME. Donc

        SELECT DATE_FORMAT(date, '%d/%m/%Y %H:%i') AS date

        ne fonctionne pas. Je suppose qu'il faut intégrer dedans STR_TO_DATE, mais j'ai beau chercher et je ne trouve pas.

        En gros, il y a une commande qui m'insère mes donnée avec une variable $date=date('d/m/Y à H:i');

        Le problème c'est que je veux ressortir toute les données mais en ordre du temps. Le probleme, c'est que la date 02/05/2010 passe avant 01/06/2010.
        Je précise que je voudrais faire ce résultat sans modifier le type de mon champ! Donc le laisser en VARCHAR!

        Merci de m'aider! :)
        0
        1. Pourquoi convertir une date avec PHP quand MySQL peut le faire ?

          SELECT DATE_FORMAT(date_news, '%d/%m/%Y %H:%i') AS date_news

          http://dev.mysql.com/doc/refman/5.0/fr/date-and-time-functions.html
          7
          1. Contributeur
            une fosi le timestamp enregistré avec time(), ce qui vosu donnera dans la bdd une date du genre 145214567 (exmple hein!)

            Vous l' afficher tres simplement avec:

            'nous somme le date(d/m/y, $timestamp)' ce qui donnera 'nous sommes le 10/10/09 (je sais pas le combien on est mais le resultat est la!)

            Vous pouvez verifier sur la page d' accueil du site que je suis en train de bricoler www.ville-de-bernay.com (la date des news)

            Pour afficher l' heure, meme systeme:

            date(d/m/y à h/m, $timestamp) ce qui donnera le 10/10/09 à 10h24
            4
            1. Voici plus simple:
              <?php
              echo strftime("%Y-%m-%d", strtotime("30/04/2009"))."<br/>";
              ?>
              0
              1. moi j'utilise un truc comme ça

                function switchdate($var)
                {
                $tab = explode("-",$var);
                $datechangee = $tab[2]."-".$tab[1]."-".$tab[0];
                return $datechangee ;
                }

                la même fonction sert à passer du format anglais au format français puisque l'on intervertit simplement le jour avec l'année

                si :
                $madate = 2009-03-04 alors changedate($madate) renverra 04-03-2009

                si :
                $madate = 04-03-2009 alors changedate($madate) renverra 2009-03-04

                c'est simple, rapide et drôlement efficace
                2
                1. Merci patrick ;)

                  T'es deux fonction marche nikel !!
                  0
                  1. Oui n'empeche que moi , j'ai le probleme j'arrive a convertir avec une fonction mais dans une boucle c'est une autre affiaire !!! j'ai juste ma dernière date qui est switchée et on ne trouve nulle part une bonne info....
                    -2
                    1. Contributeur
                      Ouai sauf que ici c'est pas ton sujet...
                      0
                  2. la derniere marche beaucoup plus vite merci
                    1
                    1. Contributeur
                      Salut tout le monde,

                      J'ai pas tout lu mais j'ai l'impression que vous vous prenez la tête pour rien.

                      Voici ma requête pour mon livre d'or :

                      mysql_query("INSERT INTO cxp_livreor VALUES('', '" . htmlentities($_POST['pseudo'], ENT_QUOTES) . "', '" . nl2br(htmlentities($_POST['message'])) . "', '" . htmlentities($_POST['age'], ENT_QUOTES) . "', '" . htmlentities($_POST['pays']) . "', '" . $_SERVER["REMOTE_ADDR"] . "', NOW())");


                      J'utilise la fonction NOW() qui a été faites exprès pour ça. Ensuite pour afficher le contenu ma requête est :
                      mysql_query('SELECT id, pseudo, message, age, pays, DATE_FORMAT(temps, \'%d/%m/%Y \à %H:%i:%S\') AS DateTemps FROM cxp_livreor ORDER BY ID DESC LIMIT ' . $premierMessageAafficher . ', ' . $nombreDeMessagesParPage);


                      DATE_FORMAT(temps, \'%d/%m/%Y \à %H:%i:%S\') AS DateTemps

                      Ceci va afficher : 30/11/2006 à 17:33:04

                      Dans ma base de donné le champs est de type datetime et ce nomme temps. La date est enregistré au format 0000-00-00 00:00:00.

                      Et la boucle while va me retourner une variable $donnees['DateTemps'].
                      30
                      1. salut tlm,
                        bon, voila, j'ai bo chercher ou poster ce message, et je suis toujours pas sûr qu'ici soit le bon endroit, mais j'ai tellement besoin d'aide, alors svp soyez indulgent!
                        en fait , j'ai fait un formulaire de contact en html/php en utilisant un script que j'ai trouvé dans un tuto... il marchait nikel, d'ailleur il marche tjrs mais le prob est que recement g ajouté des case ( tel , raison sociale, fax), le mail continue a arrivé mais son prendre considération a ce qui est ecrit dans les nouvelles cases... je suis pas un pros en php alors je vous passe le script, en fait il y a des ligne qui manque du coté php je pense....

                        <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
                        <html xmlns="http://www.w3.org/1999/xhtml">
                        <head>
                        <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
                        <title>contactez nous</title>
                        <style type="text/css">
                        <!--
                        body {
                        background-color: #000000;
                        }
                        .style2 {font-size: 16px}
                        .style3 {color: fffffff}
                        body,td,th {
                        color: #999999;
                        font-family: Calibri;
                        }
                        #Layer1 {
                        position:absolute;
                        width:252px;
                        height:125px;
                        z-index:1;
                        left: 450px;
                        top: 173px;
                        }
                        #Layer2 {
                        position:absolute;
                        width:147px;
                        height:81px;
                        z-index:1;
                        left: 837px;
                        top: 525px;
                        }
                        #Layer3 {
                        position:absolute;
                        width:987px;
                        height:80px;
                        z-index:2;
                        left: 0px;
                        top: 0px;
                        }
                        #Layer4 {
                        position:absolute;
                        width:149px;
                        height:115px;
                        z-index:3;
                        left: 207px;
                        top: 205px;
                        }
                        -->
                        </style></head>

                        </html>
                        <head>
                        <title>Contactez moi</title>
                        </head>

                        <body>

                        <form method="post" action="mail.php">

                        <h2> </h2>
                        <div id="Layer2">
                        <object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://fpdownload2.macromedia.com/get/shockwave/cabs/flash/swflash.cab#version=7,0,19,0" width="147" height="82" title="dat">
                        <param name="movie" value="date.swf" />
                        <param name="quality" value="high" />
                        <embed src="date.swf" quality="high" pluginspage="https://get.adobe.com/flashplayer/" type="application/x-shockwave-flash" width="147" height="82"></embed>
                        </object>
                        </div>
                        <h2> </h2>
                        <div id="Layer3">
                        <object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://fpdownload2.macromedia.com/get/shockwave/cabs/flash/swflash.cab#version=7,0,19,0" width="987" height="80" title="coban">
                        <param name="movie" value="contactbanner.swf" />
                        <param name="quality" value="high" />
                        <embed src="contactbanner.swf" quality="high" pluginspage="https://get.adobe.com/flashplayer/" type="application/x-shockwave-flash" width="987" height="80"></embed>
                        </object>
                        </div>
                        <h2> <u>Informations:</u></h2>
                        <p>Votre E-mail: <br />
                        <input type="text" name="votremail" />
                        <p>Raison sociale: <br />
                        <input type="text" name="raison sociale" />
                        <p>N° de tél: <br />
                        <input type="text" name="Tél" />
                        <p>N° de Fax: <br />
                        <input type="text" name="Fax" />

                        <input type="hidden" name="objet" value="mail site" />
                        </p>
                        <p>
                        Votre message:</p>
                        <div id="Layer4">
                        <object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://fpdownload2.macromedia.com/get/shockwave/cabs/flash/swflash.cab#version=7,0,19,0" width="150" height="150" title="rot">
                        <param name="movie" value="rot.swf" />
                        <param name="quality" value="high" />
                        <embed src="rot.swf" quality="high" pluginspage="https://get.adobe.com/flashplayer/" type="application/x-shockwave-flash" width="150" height="150"></embed>
                        </object>
                        </div>
                        <p>
                        <textarea cols="66" rows="6" name="message"></textarea>
                        </p>
                        <p>
                        <input type="submit" value="Envoyer" />
                        </p>

                        </form>

                        <p> </p>
                        </body>
                        <html>
                        <?php
                        $verif="!^[a-zA-Z0-9._-]+@[a-zA-Z0-9._-]{2,}\.[a-zA-Z]{2,4}$!";

                        $votremail=$_POST["votremail"];
                        $from=htmlentities("From: ".$votremail);
                        $message=stripslashes(htmlentities($_POST["message"]));

                        $destinataire="hahaha@hihhihi.com";

                        $objet=$_POST['objet'];

                        if(!preg_match($verif,$votremail))
                        {
                        echo "Votre adresse E-Mail n'est pas valide";
                        }

                        elseif (trim($message)=="")
                        {
                        echo "Votre message est vide!";
                        }

                        else
                        {
                        mail($destinataire,$objet,$message,$from);
                        echo "Merci de nous avoir choisis comme partenaire, votre requête est en cours de traitement";
                        }

                        ?>

                        P.S; j'ai remplacez le mail par un bidon//// n'y faites pas attention!!!
                        merci infiniment a l'avance!! :) c suuuuuuuuuuper urgent svp ..
                        -3
                        1. bon, voila, j'ai bo chercher ou poster ce message

                          Pourquoi pas dans un nouveau post, histoire de ne pas polluer celui-ci ?
                          0
                        2. <SCRIPT LANGUAGE="JavaScript">
                          Today = new Date;
                          Jour = Today.getDate();
                          Mois = (Today.getMonth())+1;
                          Annee = Today.getFullYear();
                          Message =Annee+"-"+ Mois +"-"+Jour;
                          </SCRIPT>

                          l appel de function

                          $date = "<script language='Javascript'> document.write(Message); </script>";
                          0
                      2. tu met la fonction changedateusfr($dateus) au debut de ta page entre deux <?php ?> si besoin

                        et tu l'appelles quand tu en a besoin, c'est à dire a l'endroit ou tu veux qu'elle s'affiche
                        2
                        1. Bonjour,j'aimerai savoir ou il faut insérer dans le code de ma page web la fonction citée dans le message précédant :

                          function changedateusfr($dateus)
                          {
                          $datefr=$dateus{8}.$dateus{9}."-".$dateus{5}.$dateus{6}."-".$dateus{0}.$dateus{1}.$dateus{2}.$dateus{3};
                          return $datefr;
                          }

                          et l'appel à cette fonction :

                          datefr=changedateusfr($dateprisedansmysql);

                          Merci pour votre aide !!!
                          1
                          1. en fait, ce que vous voulez faire est simple : transformer le format yyyy-mm-dd de mysql en jj-mm-aaaa bien de chez nous pour l'affichage en php.

                            voici donc 2 fonctions utiles qui seront appelées avantd'afficher ou avant d'enregistrer dans mysql si on veut une entrée standart francophone.

                            /////////////////////////////
                            // version 0.10 transforme une date us aaaa-mm-jj en date fr jj-mm-aaaa
                            //et vice-versa
                            /////////////////////////////
                            function changedateusfr($dateus)
                            {
                            $datefr=$dateus{8}.$dateus{9}."-".$dateus{5}.$dateus{6}."-".$dateus{0}.$dateus{1}.$dateus{2}.$dateus{3};
                            return $datefr;
                            }

                            function changedatefrus($datefr)
                            {
                            $dateus=$datefr{6}.$datefr{7}.$datefr{8}.$datefr{9}."-".$datefr{3}.$datefr{4}."-".$datefr{0}.$datefr{1};
                            return $dateus;
                            }

                            on appele les fonctions de cette façon :
                            pour transformet d'US en FR:
                            datefr=changedateusfr($dateprisedansmysql);
                            pour transformer d'US en FR:
                            dateus=changedatefrus($datefr);

                            maintenant je fais comme cela mais il y a peut-être plus simple...
                            19
                            1. Parfaite comme fonction. 1 min d'utilisation et sa fonctionne du premier coup...
                              Merci bien
                              0
                            2. Je relève le sujet!

                              J'ai modifier la fonction

                              Pas besoin de mettre ."-"., à la place utilisons les cases vides à savoir $dateus{7} et $dateus{4}

                              J'ai rajouter les heures au passage.

                              Voici donc la fonction

                              function changedateusfr($dateus) 
                              { 
                              $datefr="Le ".$dateus{8}.$dateus{9}.$dateus{7}.$dateus{5}.$dateus{6}.$dateus{4}.$dateus{0}.$dateus{1}.$dateus{2}.$dateus{3}."  à ".$dateus{11}.$dateus{12}.$dateus{13}.$dateus{14}.$dateus{15}.$dateus{16}.$dateus{17}.$dateus{18};
                              return $datefr;
                              }
                              0
                            3. parfaite petite donction, merci patrick !
                              0
                          2. J'ai inséré le code dans la partie affichage de ma page, après "or die("ouvertue base impossible);", après "mysql_close;" , avant et après la sélection de la table, avant et après "while", ça ne marche pas en l'état, je vais chercher plus tard.
                            Merci encore, quand même.
                            1
                            1. Écoute j'ai pas trouvé compliqué et ce sont mes premières heures de PHP, ajoute le code :

                              $tab = explode("-",$date_env);
                              $annee = $tab[0];
                              $mois = $tab[1];

                              if($mois==1)$mois='janvier';
                              if($mois==2)$mois='fevrier';
                              if($mois==3)$mois='mars';
                              if($mois==4)$mois='avril';
                              if($mois==5)$mois='mai';
                              if($mois==6)$mois='juin';
                              if($mois==7)$mois='juillet';
                              if($mois==8)$mois='aout';
                              if($mois==9)$mois='septembre';
                              if($mois==10)$mois='octobre';
                              if($mois==11)$mois='novembre';
                              if($mois==12)$mois='decembre';

                              $jour = $tab[2];
                              $date_env=$jour." ".$mois." ".$annee;

                              "$date_env" => C'est la date qui vient de la table SQL.
                              Y a juste à ajouter cette partie de code et ça fonctionne très bien !!!!

                              Allez bonne chance !
                              3
                              1. Je suis allé voir ton lien, c'est très intéressant, mais aussi beaucoup moins simple que je ne croyais, je pense que pour le moment je vais laisser le format YYYY/MM/DD.
                                Merci encore.
                                1
                                • 1
                                • 2