Page 1 sur 1

Date d'un jour dans une chaîne

Posté : 15 juin 2013, 09:11
par jmando
J'ai une chaîne de caractères du genre $valeur="2013/06/14, 2013/06/15 et 2013/06/16". Je voudrais que $valeur devienne :
"Fri 14/06/2013, Sat 15/06/2013 et Sun 16/06/2013".
J'ai essayé :
$valeur=preg_replace('#(\d{4})/(\d{2})/(\d{2})#',date("D",strtotime("$1/$2/$3")).' $3/$2/$1',$valeur);
Malheureusement, le jour reste bloqué à "Thu".
Un peu d'aide me ferait du bien, merci d'avance.
J.M.

Re: Date d'un jour dans une chaîne

Posté : 15 juin 2013, 10:07
par moogli
Salut,


Utilise la classe DateTime et la méthode format

@+

Re: Date d'un jour dans une chaîne

Posté : 15 juin 2013, 10:29
par jmando
Merci de l'indication, mais je ne suis pas du tout à l'aise avec la programmation objet.
J'ai l'impression que mon problème vient de ce que les variables $1,$2,$3 ne sont pas des variables globales et sont ignorées dans strtotime().
J'ai encore beaucoup à apprendre !

Re: Date d'un jour dans une chaîne

Posté : 15 juin 2013, 14:13
par moogli
Ce n'est pas compliqué tu as deux lignes a écrire ;)

Ensuite les variable que tu veux utiliser n'existe pas.



@+

Re: Date d'un jour dans une chaîne

Posté : 15 juin 2013, 15:08
par jmando
Ce n'est pas compliqué tu as deux lignes a écrire ;)

Ensuite les variable que tu veux utiliser n'existe pas.



@+
Décidément, je ne suis pas doué ! Je n'ai pas réussi à écrire les deux lignes en question.
D'autre part, je ne comprends pas pourquoi les variables $1 à $3 existent d'un côté et pas de l'autre. Pour preuve les lignes ci-dessous :
<?
echo date("D",strtotime('2013/06/15')).'<br>';
$valeur="2013/06/14, 2013/06/15 et 2013/06/16";
$valeur=preg_replace('#(\d{4})/(\d{2})/(\d{2})#',date("D",strtotime('$1/$2/$3')).' $3/$2/$1',$valeur);
echo $valeur;
?>
où ces variables sont ignorées seulement dans strtotime().
Il y a un truc qui m'échappe...

Re: Date d'un jour dans une chaîne

Posté : 15 juin 2013, 15:38
par moogli
parce que la fonction utilise en interne c'est "tags". Ils servent )à indiquer ou remettre ce qui correspond aux masques mais ce ne sont pas de vrai variable au sens on on l'entend habituellement.

ce que preg_replace prend an argument c'est des chaines de caractères, docn dans ton cas la concaténation de ton utilisation de date + le reste, il va donc faire le remplacement pour la seconde partie mais ce qu'il y a avant doit être 'vide' il y a des chances que date retourne null ou false et donc une chaine vide lors de la concaténation.

faire autant de chose en une ligne c'est jamais une bonne idée tu ne peux pas savoir ce qui se passe et encore moins debuger.

de plus les variables n'étant interprété dans une chaine délimitée pas des ' il n'y a aucune chance que cela fonctionne.
Décidément, je ne suis pas doué ! Je n'ai pas réussi à écrire les deux lignes en question.
où sont elles ?
tu commence par dateTime::createfromformat qui, comme l'indique la doc, possède une forme procédurale, donc pas d'excuse avec la poo.

ensuite date_format

toutes les fonctions sur les dates sont visible la http://www.php.net/manual/en/book.datetime.php

j'ai l'impression que tu n'a pas testé ?

il y a des exemples dans la doc, pas besoin de s'emmerder avec des expressions régulière qui ne vont pas t'aider.

$dt = date_create_from_format(le format de date','la date');
$dateFormatée = date_format($dt,'le format de sortie');

les format de dates sont expliqués dans la donc de date_create_from_format ou dans la doc de la fonction
date
test et si tu ne comprend pas on pourra t'expliquer.

tu peux changer la langue de la doc php, elle existe en français :)


@+

Re: Date d'un jour dans une chaîne

Posté : 15 juin 2013, 18:56
par Invité
Bon j'y suis arrivé, donc merci ! Toutefois, il m'a fallu informer le serveur que j'utilisais php 5.4
Voilà ce que j'ai fini par écrire et qui fonctionne.
C'est vrai que la poo n'est pas vraiment un problème.

Re: Date d'un jour dans une chaîne

Posté : 15 juin 2013, 18:58
par jmando
Je croyais avoir mis mon bout de script ??
Le voici :
<?
$valeur="2013/06/14, 2013/06/15 et 2013/06/16";
$JoursA=array('Mon','Tue','Wed','Thu','Fri','Sat','Sun');
$JoursB=array('lundi','mardi','mercredi','jeudi','vendredi','samedi','dimanche');
$tableau=preg_split('#, | et #',$valeur);
foreach ($tableau as $t)
{$date = new DateTime($t);
echo str_replace($JoursA,$JoursB,$date->format('D d/m/Y')).'<br>';};
?>