2010-04-29 3 views
0

J'utilise une notation abrégée d'une instruction if pour formater un champ. Si le champ est une chaîne vide, je le laisse comme une chaîne vide, sinon j'essaye de le formater en un format datetime approprié afin qu'il puisse être inséré dans un mysql db. voici mon code phpPHP - Courte expression if avec un format de date avec sortie bizarre

$date = ($date == '') ? date("Y-m-d", strtotime($date)) : $date; 

pour une raison quelconque lorsque la chaîne de $ date n'est pas vide, il revient, il int il formatez m/d/Y 'exemple: 04/01/2010

Quand je tirez le code hors de la sténographie si

$date = date("Y-m-d", strtotime($date)); 
print($date); 

est correctement formaté comme ceci 'Ymd' ou 2010-04-01. Est-ce que quelqu'un sait pourquoi cela se produit? Merci

Répondre

1

Je prends un peu d'un coup de poignard dans le noir ici à ce que vous essayez de accomplir avec cela, mais vous pourriez avoir plus de chance:

$date = ($ts = strtotime($date)) ? date("Y-m-d", $ts) : ''; 

Cela tentera d'analyser toute chaîne de date entrante, et échouera à une chaîne vide si la date était impossible à analyser. Notez qu'il est important de vérifier la capacité de strtotime à analyser une date, car date ("Ymd", strtotime ($ date)) retournera une date vers 1970 si $ date ne contient pas de date analysable .

.: par exemple

$ php -r 'var_dump(date("Y-m-d", strtotime("thisisnotadate")));' 
string(10) "1970-01-01" 
$ php -r 'var_dump(date("Y-m-d", strtotime("01/01/1901")));' 
string(10) "1970-01-01" 
$ php -r 'var_dump(date("Y-m-d", strtotime("01/01/2048")));' 
string(10) "1970-01-01" 
$ 

strtotime ne peut traiter que les dates qui correspondent à un horodatage 32 bits, ce qui la limite à 1970 - 2038. En outre, certains formats de date peuvent être ambigus.

+0

Merci c'est exactement ce dont j'avais besoin. – McNabbToSkins

0

Dans le cas que vous décrivez, $date doit avoir déjà été défini ailleurs dans le script en utilisant la notation m/d/Y. Dans ce cas, l'opérateur ternaire laisse $date intacte.

Lorsque vous vous débarrasser de la sténographie, cette chaîne m/d/Y est forcé dans un horodatage par strtotime, puis dans une chaîne Y-m-d appropriée par date().

+0

Nope il n'a pas, je avoir vérifier et il se passe avec défi dans la sténographie si déclaration. – McNabbToSkins

+0

@McN pouvez-vous afficher un exemple de valeur de $ date avant que ce code ne soit exécuté? –

+0

$ date = '4/01/2010'; est ce qu'il imprime pour être si je suppose que vous avez raison, la boîte de saisie est le réglage à cela, je suppose que la fonction ne fonctionne tout simplement pas pour une raison quand il est à l'intérieur de la sténographie. – McNabbToSkins

0

En ce moment, votre déclaration est:

If $date is an empty string, pass that empty string as a timestamp to the string to time function. Pass that to the date function. Otherwise return the contents of $date.

Peut-être que vous avez l'intention:

$date = ($date == '') ? date("Y-m-d") : $date; 
+0

Mon intention est que si c'est une chaîne vide, gardez-la comme une chaîne vide, sinon formatez-la en utilisant strtotime puis la fonction date. J'aurais besoin du strtotime là pour le formater correctement pour mysql – McNabbToSkins

+1

@McNabb votre code fait l'inverse en ce moment. Vous devez les retourner. –

1

vous confondre les arguments de votre opérateur ternaire, il suffit de les changer ou modifier l'opérateur d'égalité pour vérifier l'inégalité:

$date = ($date !== '') ? date("Y-m-d", strtotime($date)) : $date; 
0

Il me semble que vous faites quelque chose que vous n'avez pas besoin (en utilisant syntaxe ternaire). A partir de l'un de vos commentaires My intention is that if it is an empty string then keep it an empty string, if not then formate it using strtotime then the date function. I would need the strtotime in there to properly format it for mysql

if($date != '') // leave it alone if it is an empty string 
{ 
    $date = date("Y-m-d", strtotime($date)); 
} 

(Note importante - Je n'ai pas touché PHP depuis des années, la syntaxe peut être désactivé, mais le principe est le même)