formatage date

Invité
Invité n'ayant pas de compte PHPfrance

25 nov. 2007, 18:49

Salut,

Je recupère des dates sous le format : samedi 24 novembre 2007 par exemple.

Je veux les convertir au format AAAA-MM-JJ pour les intégrer en base de donnée mysql .

Quelqu'un a déjà fait cette conversion ?

Merci

Mammouth du PHP | 881 Messages

25 nov. 2007, 22:19

Récupères-tu à partir de formulaire?
Récupères-tu à partir de la date du système?

Le passage du texte (en français de surcroît) au code date est malaisé, vérifie les propriétés de la fonction strtotime d'abord: http://ca3.php.net/manual/fr/function.strtotime.php
ou encore mktime: http://ca3.php.net/manual/fr/function.mktime.php

Le plus simple étant de revenir au timestamp qui te permettra ensuite de faire ce que tu voudras.
Soyez artisans de paix

d0m
Mammouth du PHP | 1141 Messages

26 nov. 2007, 09:28

avant tout, il faut lister tous les formats que tu risques de récupérer,
ensuite faire une règle de conversion pour chaque cas en utilisant les fonctions de chaines de caractères (explode,expressions régulières...).

Petit nouveau ! | 3 Messages

30 janv. 2009, 12:23

Bonjour à tous,

Je me permets d'utiliser ce sujet pour résoudre un problème auquel je suis confronté. Je débute en php et plusieurs choses m'échappent pour le moment. Je cherche à modifier l'affichage de dates entrées dans une base de donnée. YYYY-mm-dd deviendrait dd-mm-YYYY. Mon idéal en termes d'affichage serait même quelque chose dans cette veine là : "10 fév. 09".

Toutes mes dates entrées dans mysql sont de type DATE. D'après ce que j'ai pu voir, il est possible de modifier le format directement dans Mysql mais ça ne semble pas être la meilleure solution. Le plus approprié serait peut être de modifier l'affichage avec php, ce que je ne parviens pas à faire, même après recherches. A savoir que j'ai une liste de dates, toutes contenues dans une table.

Mon code est le suivant. Quelle est la meilleure solution à adopter ?

Code : Tout sélectionner

<?php mysql_connect("localhost", "root", ""); mysql_select_db("maBDD"); $reponse = mysql_query("SELECT * FROM maTable ORDER BY date"); while ($donnee = mysql_fetch_array($reponse) ) { ?> <?php echo $donnee['date'];?> <?php } mysql_close(); ?>
Merci pour votre aide.

ViPHP
AB
ViPHP | 5818 Messages

30 janv. 2009, 19:06

@ameego Evidemment qu'il faut enregistrer la date au format sql et ne la transformer que pour l'affichage sinon tu ne pourrais plus utiliser les fonctions date de mysql pour faire du tri sur les dates


Pour répondre à vos deux questions :
// localisation pour utilisation des fonctions strftime() et strptime()
setlocale (LC_TIME, 'fr_FR','fra'); 

// transformation d'une date "écrite" en date pour mysql suivant la configuration locale
// Attention la fonction strptime ne fonctionne pas sous windows

$date = 'vendredi 30 janvier 2009';
$date_tab = strptime($date, '%A %d %B %Y');

$date_for_sql[] = $date_tab['tm_year'] + 1900;
$date_for_sql[] = $date_tab['tm_mon'] + 1;
$date_for_sql[] = $date_tab['tm_mday'];

$date_sql = vsprintf("%04d-%02d-%02d", $date_for_sql);
echo 'date_sql = '.$date_sql.'<br />';
// affiche : date_sql = 2009-01-30

// Transforme une date sql en date écrite selon la configuration locale
$date = strtotime($date_sql);
$date_format = strftime("%A %d %B %Y",$date);
echo 'date = '.$date_format.'<br />';
// affiche : date = vendredi 30 janvier 2009
La première transformation fonctionne pour les années >= 1900 et la seconde pour >= 1970
Modifié en dernier par AB le 24 août 2009, 20:22, modifié 1 fois.

Petit nouveau ! | 3 Messages

02 févr. 2009, 11:45

Merci pour ta réponse.

Cependant, au risque de paraître stupide, j'ai du mal à comprendre ce code et la façon de l'intégrer de manière à ce que chaque date appelée de mysql soit formatée correctement.

Si j'en crois ta réponse il y a deux transformations, mais je ne sais pas si elles sont successives ou indépendantes. Pourrais-tu m'apporter quelques précisions ?

Merci d'avance !

Modérateur PHPfrance
Modérateur PHPfrance | 6037 Messages

02 févr. 2009, 11:53

Et si tu demandais directement la date au bon format (cela signifie que le formatage se fait au niveau de la BDD, et que la charge processus repose sur le serveur qui héberge la BDD).

La doc : http://dev.mysql.com/date_format

Pour toi, cela rend ton code plus simple :
mysql_connect("localhost", "root", "");

//n'hesite pas à utiliser mysqli plutôt que mysql, c'est plus performant : seulement mysqli est dispo à partir de PHP 5

mysql_select_db("maBDD");

$reponse = mysql_query("SELECT * FROM maTable ORDER BY date"); 
// select * c'est pas bien :)
// n'appelle pas tes champs date, mot réservé, source de bazar, préfère date_inscr ou date_insertion ou je ne sais quelle autre description


$reponse = mysql_query("SELECT DATE_FORMAT('date', '%d %M %Y') FROM maTable ORDER BY maDate"); 
// attention tu vas l'avoir en anglais


while ($donnee = mysql_fetch_array($reponse) )
 {
     $maDate =  $donnee['date'];
 }
 mysql_close();
Exemple

Code : Tout sélectionner

mysql> SELECT DATE_FORMAT('2009-10-04 22:23:00', '%W %M %Y'); -> 'Sunday October 2009'
Règle n°2 du webmaster : Toujours commencer par le HTML qu'on veut obtenir....toujours ! :priere:
J'aime apprendre de nouvelles choses.

Petit nouveau ! | 3 Messages

02 févr. 2009, 12:23

Un grand merci pour ta réponse rapide.

Ce sont de précieux conseils que tu m'as donné, notamment ce qui concerne l'importance du nom d'un champ pour éviter les confusions.

Sinon, pour quelles raisons il n'est pas conseillé d'utiliser "Select *" ? Existe-t-il une alternative pour arriver au même résultat ?

Merci !

Modérateur PHPfrance
Modérateur PHPfrance | 6037 Messages

02 févr. 2009, 12:29

Eviter le " SELECT * " :
Précisez le nom des champs que vous souhaitez récupérer pour éviter les risques d'erreur (lorsqu'un même nom se trouve dans plusieurs table), avoir des requêtes plus optimisées et un code php facilement maintenable.
Lister les champs en détail permet d'une part de ne récupérer que ce qui est nécessaire (inutile de ramener 12 champs mediumtext de 500Ko quand tout ce qui nous interesse c'est un id et un titre). De plus, le nombre de colonnes et l'ordre des champs pouvant avoir un impact sur le traitement qui va suivre (si l'on utilise mysql_fetch_row() par exemple), il est préférable de pouvoir les maîtriser.
Cela permet aussi de connaître les noms des colonnes retournés par la requête, et donc le noms des index utilisables.
 Do's and don't : les bonnes pratiques en SQL[/url]
Règle n°2 du webmaster : Toujours commencer par le HTML qu'on veut obtenir....toujours ! :priere:
J'aime apprendre de nouvelles choses.

ViPHP
AB
ViPHP | 5818 Messages

03 févr. 2009, 18:16

Merci pour ta réponse.

Cependant, au risque de paraître stupide, j'ai du mal à comprendre ce code et la façon de l'intégrer de manière à ce que chaque date appelée de mysql soit formatée correctement.

Si j'en crois ta réponse il y a deux transformations, mais je ne sais pas si elles sont successives ou indépendantes. Pourrais-tu m'apporter quelques précisions ?

Merci d'avance !
Bien sûr elles sont indépendantes.
La première est dans l'hypothèse où un visiteur rentrerait une date en français (ex: mardi 3 février 2009) dans un champ de saisie et on la transforme pour être au format mysql.

La seconde fait l'inverse, elle par d'une date au format mysql pour un affichage en français (lire les commentaires du code et voir la doc sur les fonctions utilisées pour obtenir un autre formatage).

Eléphant du PHP | 139 Messages

04 févr. 2009, 01:49

Petite question au sujet de
Eviter le " SELECT * " :
Précisez le nom des champs que vous souhaitez récupérer pour éviter les risques d'erreur (lorsqu'un même nom se trouve dans plusieurs table), avoir des requêtes plus optimisées et un code php facilement maintenable.
Dans le cas ou tous les champs d'une table sont "appelés", que préférer?
un select (et lister tous les champs) ou un select * ?

ViPHP
AB
ViPHP | 5818 Messages

04 févr. 2009, 03:44

Petite question au sujet de
Eviter le " SELECT * " :
Précisez le nom des champs que vous souhaitez récupérer pour éviter les risques d'erreur (lorsqu'un même nom se trouve dans plusieurs table), avoir des requêtes plus optimisées et un code php facilement maintenable.
Dans le cas ou tous les champs d'une table sont "appelés", que préférer?
un select (et lister tous les champs) ou un select * ?
Dans l'absolu lister tous les champs est un peu plus performant mais il est évident que dans ce cas la différence sera beaucoup moins significative et que pour des raisons pratiques on puisse préférer un select *