Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

php : conversion datetime en français ???

44 views
Skip to first unread message

Une Bévue

unread,
Aug 27, 2011, 8:06:00 AM8/27/11
to
comme le groupe "fr.comp.lang.php" semnle mortibus, je poste ici au cas
o�...

j'ai besoin d'afficher des datetimes avec php, dans ma base le format
est ISO, je converti pour obtenir :

Tue, 05 Jul 2011 15:37:49 +0200

je pr�f�rerais avoir �a en french )))

il faut le faire soi m�me ou bien existe t'il une manip, � partir de
locale ou autre qui converti dans la langue par d�faut de la b�canne ???

--
� L'humanit� qui devrait avoir six mille ans d'exp�rience,
retombe en enfance � chaque g�n�ration. �
(Tristan Bernard)

Vincent

unread,
Aug 27, 2011, 11:15:08 AM8/27/11
to
Le 27/08/2011 14:06, Une Bévue a écrit :
> Tue, 05 Jul 2011 15:37:49 +0200
> je préférerais avoir ça en french )))

Kekchozcomssa ?

<?php

//on récupère le jour, le mois et l'année grâce à la fonction date()

$jour = date("d");
$mois = date("n");
$annee = date("Y");
$joursemaine = date("w");
//on crée un tableau à une dimension contenant les noms de mois

$moisfrancais = array ( 1 => "Janvier", "Février", "Mars", "Avril",
"Mai", "Juin", "Juillet", "Aout", "Septembre", "Octobre", "Novembre",
"Décembre");
$joursemainefrancais = array (0 => "Dimanche", "Lundi", "Mardi",
"Mercredi", "Jeudi", "Vendredi", "Samedi");

// 1=> indique que le tableau commence à 1 (alors qu'un tableau commence
par défaut à 0)

//affichage de la date
echo "<br />";
echo "Nous sommes le : ";
echo "$joursemainefrancais[$joursemaine] " ;
echo "$jour ";
echo "$moisfrancais[$mois] ";
echo "$annee ";

?>

Une Bévue

unread,
Aug 28, 2011, 1:31:59 AM8/28/11
to
Vincent <vincen...@sfr.fr> wrote:

ah oui merci beaucoup donc, si j'ai bien compris, ça n'existe pas en
builtin comme dans d'autres langages.

bon, j'ai légérement modifier ton code pour utiliser une function :
<?php
header('Content-type: text/html; charset=utf-8');

function date2fr($adate) {


$moisfrancais = array ( 1 => "Janvier", "Février", "Mars",

"Avril", "Mai", "Juin", "Juillet", "Août",

"Septembre", "Octobre", "Novembre", "Décembre");
$joursemainefrancais = array (0 => "Dimanche", "Lundi", "Mardi",
"Mercredi", "Jeudi", "Vendredi", "Samedi");

$jour=$adate->format('d');
$mois=$moisfrancais[$adate->format('n')];
$annee=$adate->format('Y');
$joursemaine=$joursemainefrancais[$adate->format('w')];
return "$joursemaine $jour $mois $annee à
".$adate->format('H')."H".$adate->format('i:s');
}
function isodate2fr($isodatestring){
return date2fr(new DateTime($isodatestring));
}
$ctime=new DateTime('2011-07-05T15:37:49+02:00');
echo "\$ctime=new DateTime('2011-07-05T15:37:49+02:00');<br />";
echo date2fr($ctime)."<br />";
echo "<br />";
echo "Créé le ".isodate2fr('2011-07-05T15:37:49+02:00').".<br />";
?>

ce qui me gène est que les tableaux $moisfrancais et
$joursemainefrancais sont recréés à chaque appel de la function
date2fr($adate) est)ce que ça peut se mettre en global ou qqc du genre ?


--
« Le vrai problème avec les menteurs est que l'on ne peut jamais
être certain qu'ils ne vont pas dire la vérité. »
(Kingsley Amis)

Jean-Francois Ortolo

unread,
Aug 28, 2011, 3:10:22 AM8/28/11
to
Le 28/08/2011 07:31, Une Bévue a écrit :
>
> ce qui me gène est que les tableaux $moisfrancais et
> $joursemainefrancais sont recréés à chaque appel de la function
> date2fr($adate) est)ce que ça peut se mettre en global ou qqc du genre ?
>
>


Bonjour Monsieur

D'après mes cours d'Informatique qui datent de Mathusalem, les
variables locales à une fonction, sont placées dans la pile, qui elle
même, est dépilée à chaque retour de la fonction.

Donc, d'une part ces variables locales, n'existent strictement que
durant l'appel à la fonction. D'autre part, l'accès à ces variables
locales, se faisant dans la pile, sont plus rapides que des accès à des
variables de type externe, ou static.

Maintenant, est-ce que ce raisonnement est valable pour un langage
interprété comme le php... Je ne sais pas.

En fait... Je ne sais même pas, si le php est réellement uniquement
interprété, ou bien fait l'objet d'une compilation "just-in-time", ou
même une précompilation suivie d'une interprétation, comme c'est le cas
en Java.

Quant à Java, je suis plus que profondément nul en Java, vu que je
n'ai jamais pratiqué. ;)

La Javanaaaaaiiiiiisssseeee....

Bien à vous.

Amicalement.

Jean François Ortolo

--
Visitez mon site gratuit donnant des Statistiques,
Pronostics et Historiques Graphiques
sur les Courses de Chevaux:
http://www.pronostics-courses.fr

Dominique Ottello

unread,
Aug 28, 2011, 8:31:07 AM8/28/11
to
unbewus...@fai.invalid (Une Bévue) écrivait :

> Tue, 05 Jul 2011 15:37:49 +0200

> je préférerais avoir ça en french )))

J'avais donné une réponse, avec crosspost sur fr.comp.lang.php et fu2
sur dito, mais, a priori, ce n'est pas passé. Je republie uniquement
ici.

Effectuer la conversion par strftime()
http://fr2.php.net/manual/fr/function.strftime.php
en faisant un /setlocale(LC_TIME,'fr_FR);/ juste avant. (1) (2)

Il se peut que le résultat de strftime() soit iso-8859-1 alors que l'on
souhaite obtenir de l'utf-8, donc ;
$date_format = '%d %B %Y';
setlocale(LC_TIME,'fr_FR'');
$date = iconv('ISO-8859-1',
'UTF-8//TRANSLIT//IGNORE',strftime($date_format, $timestamp));

(1) La valeur 'fr_FR' peut être différente en fonction des serveurs,
pour s'affranchir de cet éventuelle problème, on peut mettre plusieurs
valeurs, la « bonne » valeur sera prise par le serveur :
setlocale(LC_TIME,'fr_FR','french','French_France.1252','fr_FR.ISO8859-1','fra');

(2) Pourquoi faire un setlocale() juste avant et pas une bonne fois pour
toutes ?
Comme il est écrit dans la documentation :
L'information locale est maintenue par processus, non par thread. Si
vous faites fonctionner PHP sur un serveur multi-threadé comme IIS ou
Apache sur Windows, vous pourriez obtenir des changements soudains des
configurations locales pendant qu'un script fonctionne, même si celui-ci
n'appelle jamais la fonction setlocale(). Ceci survient à cause des
autres scripts qui fonctionnent dans des threads différents du même
processus. Ces scripts changent les configurations locales dans le
processus au complet en utilisant la fonction setlocale().
--
Il vaut mieux ignorer où l'on est, et savoir qu'on l'ignore, que de se
croire avec confiance où l'on n'est pas. Jean Dominique Cassini.
Technologie aéronautique - http://ottello.net - Les anciens de Vilgénis

Une Bévue

unread,
Aug 28, 2011, 9:31:41 AM8/28/11
to
Dominique Ottello <air.i...@fra.fr.invalid> wrote:

> J'avais donné une réponse, avec crosspost sur fr.comp.lang.php et fu2 sur
> dito, mais, a priori, ce n'est pas passé. Je republie uniquement ici.

c'est quoi "dito" ???

> Effectuer la conversion par strftime()
> http://fr2.php.net/manual/fr/function.strftime.php en faisant un
> /setlocale(LC_TIME,'fr_FR);/ juste avant. (1) (2)
>
> Il se peut que le résultat de strftime() soit iso-8859-1 alors que l'on
> souhaite obtenir de l'utf-8, donc ; $date_format = '%d %B %Y';
> setlocale(LC_TIME,'fr_FR''); $date = iconv('ISO-8859-1',
> 'UTF-8//TRANSLIT//IGNORE',strftime($date_format, $timestamp));
>
> (1) La valeur 'fr_FR' peut être différente en fonction des serveurs, pour
> s'affranchir de cet éventuelle problème, on peut mettre plusieurs valeurs,
> la « bonne » valeur sera prise par le serveur :
> setlocale(LC_TIME,'fr_FR','french','French_France.1252','fr_FR.ISO8859-1',
> 'fra');
>
> (2) Pourquoi faire un setlocale() juste avant et pas une bonne fois pour
> toutes ? Comme il est écrit dans la documentation : L'information locale
> est maintenue par processus, non par thread. Si vous faites fonctionner
> PHP sur un serveur multi-threadé comme IIS ou Apache sur Windows, vous
> pourriez obtenir des changements soudains des configurations locales
> pendant qu'un script fonctionne, même si celui-ci n'appelle jamais la
> fonction setlocale(). Ceci survient à cause des autres scripts qui
> fonctionnent dans des threads différents du même processus. Ces scripts
> changent les configurations locales dans le processus au complet en
> utilisant la fonction setlocale().

OK, super, merci beaucoup pour toutes ces précisions !
Je n'ai pas iconv avec mon php5 mais je suppose que étant une extension,
je peux l'installer après coup, comme je viens de le faire pour xsl ???

> -- Il vaut mieux ignorer où l'on est, et savoir qu'on l'ignore, que de se
> croire avec confiance où l'on n'est pas. Jean Dominique Cassini.

pas mal cette citation, je l'ajoute aux miennes ;-)

--
« Il n'y a pas de hasards, il n'y a que des rendez-vous. »
(Paul Eluard)

Dominique Ottello

unread,
Aug 28, 2011, 10:40:29 AM8/28/11
to
unbewus...@fai.invalid (Une Bévue) écrivait :

> > J'avais donné une réponse, avec crosspost sur fr.comp.lang.php et fu2 sur
> > dito, mais, a priori, ce n'est pas passé. Je republie uniquement ici.
>
> c'est quoi "dito" ???

dito : de même, idem, comme indiqué plus haut

donc ... avec crosspost sur fr.comp.lang.php et Followup-To sur
fr.comp.lang.php

Quant à iconv :
Avec PHP 5, cette extension est activée par défaut, cependant, elle peut
être désactivée en compilant PHP avec l'option --without-iconv.
Dans un phpinfo() cela se voit, par exemple, avec :
iconv
iconv support enabled
iconv implementation "libiconv"
iconv library version 1.11

- Remarque concernant fr.comp.lang.php
Le dernier message date du 31 juillet 2011.
Il semblerait que la démodération de ce groupe ait eu des répercussions
non souhaitées, comme la non publication des messages.

--
"Tarifs-Album" de MANUFRANCE de 1911 : "Note à l'attention de nos clients :
Mesdames et messieurs, sachez que la société MANUFRANCE ne vous vendra pas
1 franc ce qui lui coute 10 francs et que pour 1 franc vous n'en aurez
toujours que pour 1 franc". Dominique Ottello - http://www.ottello.net

Une Bévue

unread,
Aug 28, 2011, 10:57:59 AM8/28/11
to
Dominique Ottello <air.i...@fra.fr.invalid> wrote:

> Effectuer la conversion par strftime()
> http://fr2.php.net/manual/fr/function.strftime.php
> en faisant un /setlocale(LC_TIME,'fr_FR);/ juste avant. (1) (2)
>
> Il se peut que le résultat de strftime() soit iso-8859-1 alors que l'on
> souhaite obtenir de l'utf-8, donc ;
> $date_format = '%d %B %Y';
> setlocale(LC_TIME,'fr_FR'');
> $date = iconv('ISO-8859-1',
> 'UTF-8//TRANSLIT//IGNORE',strftime($date_format, $timestamp));

bon après avoir installé l'extension iconv de php5, j'ai réalisé un
premier essai, pas vraiment concluant, premier script avec iconv :


<?php
header('Content-type: text/html; charset=utf-8');

$date_format='%d %B %Y';
etlocale(LC_TIME,'fr_FR');
$date= iconv('ISO-8859-1',
'UTF-8//TRANSLIT//IGNORE',strftime($date_format));
echo $date."<br %>";
?>

sur le browser, ça donne :
28 août 2011

donc il y a un pb d'encodage (j'ai forcé UTF-8 sur le browser)
<?php
header('Content-type: text/html; charset=ISO-8859-1');
$date_format='%d %B %Y';
setlocale(LC_TIME,'fr_FR');
$date=strftime($date_format);
echo $date."<br %>";
?>
donc sans utilisation d'iconv, et là, boum !!!
tjs un problème d'encodage :
28 août 2011
exactement la même chose que tout à l'heure mais avec le browser réglé
sur iso-8859-1

Par contre OH, grande surprise, si je change le header du précédent
fichier, qui devient :
<?php
//header('Content-type: text/html; charset=ISO-8859-1');


header('Content-type: text/html; charset=utf-8');

$date_format='%d %B %Y';
setlocale(LC_TIME,'fr_FR');
$date=strftime($date_format);
echo $date."<br %>";
?>

et que je force mon browser à utf-8 j'obtiens oh, miracle :
28 août 2011
ce qui était recherché...

aurais-je installé iconv pour rien ???
en tk ça signifie que chez moi (php 5.3.6) strftime sort en utf-8 non
???

ce qui est plutôt uine bonne nouvelle pour moi qui n'utilise QUE cet
encodage...
du coup j'ai créé un autre fichier en ISO :

--
« La bouse de la vache est plus utile que les dogmes :
on peut en faire de l'engrais. »
(Mao Tsé-Toung / 1896-1976)

Une Bévue

unread,
Aug 28, 2011, 11:57:56 AM8/28/11
to
Dominique Ottello <air.i...@fra.fr.invalid> wrote:

> dito : de même, idem, comme indiqué plus haut

OK

>
> Quant à iconv :
> Avec PHP 5, cette extension est activée par défaut, cependant, elle peut
> être désactivée en compilant PHP avec l'option --without-iconv.
> Dans un phpinfo() cela se voit, par exemple, avec :
> iconv
> iconv support enabled
> iconv implementation "libiconv"
> iconv library version 1.11
>

ben j'avais regardé mon info.php, pas d'iconv dedans...
mais je l'ai rajouté (inutilement d'ailleurs) entre-temps, cf mon fil
plus bas :
Message-ID: <1k6pyfw.1higjmooude6yN%unbewus...@fai.invalid>

(tout juste posté)

c'est tout de même plus élégant, comme solution avec strftime, un grand
merci !!!

> - Remarque concernant fr.comp.lang.php
> Le dernier message date du 31 juillet 2011.
> Il semblerait que la démodération de ce groupe ait eu des répercussions
> non souhaitées, comme la non publication des messages.

ouais, plus rien ne passe, un désaccord ???

Dominique Ottello

unread,
Aug 28, 2011, 12:08:20 PM8/28/11
to
unbewus...@fai.invalid (Une B�vue) �crivait :

> aurais-je install� iconv pour rien ???
> en tk �a signifie que chez moi (php 5.3.6) strftime sort en utf-8 non

Il ne faut pas faire joujou avec les encodages n'importe comment.

Il ne faut pas changer les ent�tes qui DOIVENT correspondent au codage
r�el des pages g�n�r�es et on laisse - sauf cas tr�s particulier - le
navigateur en mode de d�tection automatique.

Si strftime() � sort � en utf-8 et que tes pages sont iso-8859-1, il
suffit d'inverser la fonction de transcodage iconv() et si tes pages
sont utf-8, tu n'utilises pas la fonction iconv().

> sur le browser, �a donne : 28 août 2011
Codage utf-8 sur pages iso-8859-1

--
Ce n'est pas parce que l'erreur se propage qu'elle devient v�rit�. Gandhi
Technologie a�ronautique : http://aviatechno.free.fr (http://ottello.net)
Concorde dans la presse de 1965 � 2003 : http://le.pointu.free.fr

Une Bévue

unread,
Aug 28, 2011, 12:42:16 PM8/28/11
to
Dominique Ottello <air.i...@fra.fr.invalid> wrote:

> > aurais-je installé iconv pour rien ???
> > en tk ça signifie que chez moi (php 5.3.6) strftime sort en utf-8 non


>
> Il ne faut pas faire joujou avec les encodages n'importe comment.

euh, j'ai suivi un conseil qui supposait que strftime sortait de
l'SO-8859-1; d'où la converion iso -> utf-8.

> Il ne faut pas changer les entêtes qui DOIVENT correspondent au codage
> réel des pages générées et on laisse - sauf cas très particulier - le
> navigateur en mode de détection automatique.

je n'ai forcé, au niveau browser, QUE parce qu'il y avait un problème.
l'en-tête envoyée par php correspondait à ce que je --croyais-- obtenir.

> Si strftime() « sort » en utf-8 et que tes pages sont iso-8859-1, il
> suffit d'inverser la fonction de transcodage iconv() et si tes pages
> sont utf-8, tu n'utilises pas la fonction iconv().
>

> > sur le browser, ça donne : 28 août 2011


> Codage utf-8 sur pages iso-8859-1

pas du tout, dans un cas, avec transfo iconv, c'est la transfo qui
déconne, normal, je cherche à faire une transfo iso -> utf-8 quand je
file déjà à iconv de l'utf-8

le second cas c'est une page annoncée comme iso qui sort de l'utf-8
et là j'ai bien eu raison de forcer le navigateur à utf-8 ça m'a permis
de m'apercevoir que, contrairement à ce qui m'avait été annoncé,
strftime sort en utf-8.

du coup mon header annonce utf-8; je n'ai plus d'iconv et ça roule.


--
« Quand tu lances la flèche de la vérité,
trempe la pointe dans du miel. »
(Proverbe arabe)

Dominique Ottello

unread,
Aug 30, 2011, 6:48:34 PM8/30/11
to
unbewus...@fai.invalid (Une Bévue) écrivait :

> j'ai besoin d'afficher des datetimes avec php, dans ma base le format
> est ISO, je converti pour obtenir :
>
> Tue, 05 Jul 2011 15:37:49 +0200
>

> je préférerais avoir ça en french )))

En français !

Effectuer la conversion par strftime()
http://fr2.php.net/manual/fr/function.strftime.php
en faisant un

setlocale(LC_TIME,'fr_FR);
juste avant. (1)

Il se peut que le résultat de strftime() soit iso-8859-1 alors que l'on
souhaite obtenir de l'utf-8, donc ;
$date_format = '%d %B %Y';
setlocale(LC_TIME,'fr_FR'');
$date = iconv('ISO-8859-1',
'UTF-8//TRANSLIT//IGNORE',strftime($date_format, $timestamp));

(1) La valeur 'fr_FR' peut être différente en fonction des serveurs,


pour s'affranchir de cet éventuelle problème, on peut mettre plusieurs
valeurs, la « bonne » valeur sera prise par le serveur :
setlocale(LC_TIME,'fr_FR','french','French_France.1252','fr_FR.ISO8859-1','fra');

--
Il vaut mieux ignorer où l'on est, et savoir qu'on l'ignore, que de se
croire avec confiance où l'on n'est pas. Jean Dominique Cassini.

0 new messages