8768 sujets

Développement web côté serveur, CMS

Bonjour,

Je souhaite transformer une chaine de caractère enregistrée dans une opiton WordPress de la forme jj/mm/aaa au format UTC (yyyy-mm-dd).

Pour ce faire je tente d'utiliser ceci :
$CreationDate = get_option('scriptura_site_creation_date');
$UtcCreationDate = date('Y-m-d', strtotime($CreationDate));

Or la variable $UtcCreationDate me renvoie la valeur 1970-01-01, donc j'imagine une sorte de valeur par défaut du timestamp...

Où est mon erreur ?
C'est bon, j'ai finalement trouvé : je devais d'abord convertir jj/mm/aaa en jj-mm-aaa. Ce qui donne :
$CreationDate = get_option('scriptura_site_creation_date');
$StrCreationDate = str_replace('/', '-', $CreationDate);
$UtcCreationDate = date('Y-m-d', strtotime($StrCreationDate));
c'est une solutioon en effet sinon une petite fonction que j'ai faite et qui fonctionne à partir de php > 5.3

function date_change_format($ladate,$from='Y-m-d', $to='d/m/Y'){ // PHP > 5.3
	if($ladate !=''){
		$date = DateTime::createFromFormat($from, $ladate);
		return $date->format($to);
	}else{
		return "";
	}
}


tu envoi la date tu indiques le format d'origine, tu indique le format que tu veux en sortie et hop ça change tout Smiley smile

ça fonctionne avec tout les éléments de la fonction date() en entrée comme en sortie
Merci @pchlj !

Cette fonction est très intéressante : souple, orientée objet... parfaite. Adoptée.
Bonjour,

J'aimerais utiliser votre fonction, qui à l'air de pouvoir convenir à mon besoin.

En tous cas elle fonctionne pour afficher au format jj/mm/aaaa, une date provenant d'une bdd au format aaaa-mm-jj.

Après une requête sql, je ressort la valeur de ma colonne "doc_date" : $resultat['doc_date']
Ce qui me fait utiliser votre fonction comme suit : echo date_change_format($resultat['doc_date']);

Comment précise-t-on les paramètres from et to ?
Si je change dans la fonction, elle aura toujours le même rôle ?

Est-ce que cela fonctionnerais ? :
function date_change_format($ladate,$from, $to){ // PHP > 5.3
	if($ladate !=''){
		$date = DateTime::createFromFormat($from, $ladate);
		return $date->format($to);
	}else{
		return "";
	}
}

from='d/m/Y';
to='Y-m-d';
echo date_change_format($_POST['date'],$from,$to)

Par avance, je vous remercie de votre aide.
Modifié par Alexbass (04 Feb 2015 - 22:48)
Bonjour. Attention, vous ne devez pas changer les paramètres dans la fonction, sauf si vous souhaitez que ces paramètres soient pas défaut. En effet, le fait de les définir directement au niveau de la fonction permet de les rendre optionnels.

Donc, en admettant que vous ne touchiez à rien au niveau de la fonction, et que vous faisiez appel à la fonction telle quelle vous auriez ceci :
echo date_change_format($resultat['doc_date']); // ce qui donne jj/mm/aaaa 

Toujours sans modifier la fonction, si l'on voulait modifier la sortie en jj-mm-aaaa il faudrait faire ceci :
echo date_change_format($resultat['doc_date'], $from='Y-m-a', $to='d-m-Y'); // ce qui donne jj-mm-aaaa

L'intérêt de tout cela ? Cela évite d'avoir une fonction par format de date. Car il faudrait non seulement une fonction par rendu (to) mais aussi tenir compte du format d'origine (from). Format qui entre nous devrait être le même par convention sur tout le site, mais ce n'est pas toujours possible (les heures peuvent être optionnelles). C'est pour cela que je disais plus haut que la solution de pchlj de était "souple".
merci olivier d'avoir répondu Smiley smile

Comme je l'ai indiqué les paramètres from et to peuvent recevoir TOUS les paramètres de la fonction date() de php

le $from correspond au format d'entré de la date et le $to au format que l'on veut en sortie

SANS modifier du tout ma fonction

ce que tu proposes alexbass
from='d/m/Y';
to='Y-m-d';
echo date_change_format($_POST['date'],$from,$to)


fonctionne parfaitement Smiley smile

et meme plus directement encore ainsi

echo date_change_format($_POST['date'], 'd/m/Y', 'Y-m-d');
Bonjour,

Je vous remercie pour ces explications, et j'essaierais dès ce soir.
Si je comprends bien, la "précision" lors de l'appel de la fonction passe par dessus les paramètres de la fonction elle même ?

Est-ce que cela fonctionnerai :

function date_change_format($ladate,$from='Y-m-d', $to='d/m/Y'){ // PHP > 5.3
	if($ladate !=''){
		$date = DateTime::createFromFormat($from, $ladate);
		return $date->format($to);
	}else{
		return "";
	}
}
echo date_change_format($resultat['doc_date'], $from='d/m/Y', $to='Y-m-d'); // ce qui donne aaaa-mm-jj

Comment gérer le champ "date" fonctionnel sous chrome, firefox et safari, qui doit recevoir une vrai date (pas jj/mm/aaaa), et le champ "text" sous IE ?
Je sais pas si je suis claire. Smiley decu

En gros, dans mon formulaire, si j'ai un champs de type date et que je lui envoi "jj/mm/aaaa", ça fonctionne pas. Sur IE, ça fonctionne car le type date est reconnu en type text.
a écrit :
Si je comprends bien, la "précision" lors de l'appel de la fonction passe par dessus les paramètres de la fonction elle même ?


La c'est carrément un problème de compréhension de l'écriture des fonctions Smiley cligne

Les paramètres passés lors de la création de la fonction sont là ESSENTIELLEMENT pour les rendre optionnels. De ce fait SI ils ne sont pas renseignés ils prennent cette valeur par défaut et la fonction "fonctionne". ce qui ne serait pas le cas si ils n'avaient pas de valeur par défaut.

Ensuite cela n'a aucun rapport avec un champs date...

qu'entend tu par "vrai date" ???
bonsoir,

Il est tout à fait possible qu'il y ait un problème de compréhension des fonctions. Tant dans leur écriture, que dans leur structure et dans leur fonctionnement en général. Smiley cligne Mais je ne demande qu'à apprendre. Smiley smile
pchlj a écrit :
qu'entend tu par "vrai date" ???
Alexbass a écrit :
En gros, dans mon formulaire, si j'ai un champs de type date et que je lui envoi "jj/mm/aaaa", ça fonctionne pas. Sur IE, ça fonctionne car le type date est reconnu en type text.

J'ai l'impression qu'une vrai date doit être sous la forme aaaa-mm-dd, pour pouvoir être interprétée par un champ de type date.

Ce qui me fait dire ça :
1 - lorsque je change le format de la date récupérée en bdd sous le format aaaa-mm-dd, pour l'afficher dans un champ de type text sur IE, au format dd/mm/aaaa, elle s'affiche bien. Alors que cette même date, donc au format dd/mm/aaaa, ne s'affiche pas dans le champ date sous chrome ou safari.
2 - si je ne modifie pas le format de la date récupérée en bdd sous le format aaaa-mm-dd, celle ci s'affiche correctement dans le champ de type date sous chrome et safari, mais, par conséquent, s'affiche au format aaaa-mm-dd sous IE.

Les complications sont d'autant plus observables lorsque je modifie la date sous IE. En base de donnée, j'obtiens 0000-00-00. Smiley decu

Est-ce que ce problème est récurrent, ou bien, dois-je abandonner le champ de type date fonctionnel sous chrome, safari et firefox pour un champ de type text universel ?
Qu'en pensez-vous ?

Ps : Le problème n'est pas lié à la fonction Smiley cligne
re

J'ai fait une page de test : http://www.alexbass.net23.net/testdate.php

Il n'y a aucun traitement sur la date renseignée dans le champs de type text.
Entrez 01/02/2015 et validez -> Le champ de type date ne se rempli pas.
Entrez 2015-02-01 et validez -> Le champ de type date se rempli.

La valeur est simplement récupérée par $_POST['date']

Sur chrome, le problème se pose, alors que sur IE, la date s'affiche dans les deux cas.
Modifié par Alexbass (05 Feb 2015 - 20:59)
Bonjour Olivier.

Je vois que tu à compris mon problème.
A force de lire et de chercher, je m'y suis raisonné.

Par contre, j'ai toujours un problème. Smiley smile

Est-ce que le fait de changer le format, permet de chercher ma date en bdd ?
Je n'ai pas l'impression Smiley decu
Ca fonctionne. C'était ma requête qui était mal rédigée.
les requetes SQL avec dates doivent être précises... Smiley smile

Merci à vous deux pour votre aide et votre gentillesse.
Et merci pour la fonction que j'adopte également Smiley cligne
Alexbass a écrit :
Est-ce que le fait de changer le format, permet de chercher ma date en bdd ?

Juste pour répondre : sur un site WordPress - donc avec des dates enregistrées dans la table wp_options dans des colonnes de type TEXT - je laisserais la fonction telle quelle.

Par contre, sur des sites plus personnalisés utilisant des colonnes DATETIME j'utiliserais plutôt 'Y-m-d H:i:s' pour le paramètre $from par défaut de la fonction. À moins bien sûr que le site se contente de colonnes DATE.