2014-05-01 1 views
2

Je sélectionne une date dans ma date d'entrée avec jQuery datepicker.Erreur lors de la conversion de la date en datetime

Le format Im en utilisant dans datepicker script est: dateFormat: 'DD, d MM, yy',

donc je reçois cette date dans mon entrée: "Quinta-feira, 1 Maio, 2014" (date portugais).

Mais maintenant j'ai besoin de convertir cette date pour enregistrer comme date/heure dans mysql.

Je avais besoin que d'utiliser ce code ci-dessous si la date était en anglais:

$date = DateTime::createFromFormat('l, j F, Y', $_POST['date']); 
echo $date->format('Y-m-d');  

Mais ma date isnt anglais, donc je dois faire la conversion et Im essayant d'utiliser la fonction ci-dessous « convertDate » à fais ceci.

Mais quand je l'appelle la fonction, et je passe la valeur de la date d'entrée comme celui-ci: convertDate($_POST['date']);

J'ai eu une erreur "appel à un format de fonction membre() sur un non-objet dans ce ligne: $day= $date->format("l");

vous voyez quelque chose de mal ici parce que le fucntion semble bon pour moi

function convertDate($myDate){ 

     $date = DateTime::createFromFormat('Ymd', $myDate); 
     $day = $date->format("l"); 
     $daynum = $date->format("j"); 
     $month = $date->format("F"); 
     $year = $date->format("Y"); 

     switch($day) 
     { 
      case "Segunda-Feira": $day = "Monday"; break; 
      case "Terça-Feira":  $day = "Tuesday"; break; 
      case "Quarta-Feira":  $day = "Wednesday"; break; 
      case "Quinta-Feira":  $day = "Thursday"; break; 
      case "Sexta-Feira":  $day = "Friday"; break; 
      case "Sábado":   $day = "Saturday"; break; 
      case "Domingo":   $day = "Sunday"; break; 
      default:     $day = "Unknown"; break; 
     } 

     switch($month) 
     { 
      case "Janeiro": $month = "January"; break; 
      case "Fevereiro": $month = "February"; break; 
      case "Março":  $month = "March";  break; 
      case "Abril":  $month = "April";  break; 
      case "Maio":  $month = "May";  break; 
      case "Junho":  $month = "June";  break; 
      case "Julho":  $month = "July";  break; 
      case "Agosto":  $month = "August"; break; 
      case "Setembro": $month = "September"; break; 
      case "Outubro": $month = "October"; break; 
      case "Novembro": $month = "November"; break; 
      case "Dezembro": $month = "December"; break; 
      default:   $month = "Unknown"; break; 
     } 

    echo $daynum . ", " . $month . ", " . $year; 
} 

Essayer de s! tr_ireplace:

$english = array("Segunda-Feira","Terça-Feira","Quarta-Feira","Quinta-Feira","Sexta-Feira","Sábado","Domingo"); 
$portuguese = array("Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","Sunday"); 
$result= str_ireplace ($english , $portuguese, $_POST['date']); 
$date = DateTime::createFromFormat('l, j F, Y', $result); 
echo $date->format('Y-m-d'); 

Je suis même erreur dans echo $date->format('Y-m-d')

+0

Faire un 'var_dump ($ myDate)' et nous montrer les résultats S'il vous plaît. –

+0

Je reçois ceci: "string (25)" Sexta-feira, 2 Maio, 2014 "", c'est la date que j'ai choisi dans mon agenda! – OzzC

+0

Vous êtes de retour au même problème que vous aviez dans votre dernière question. Ce format de date ne fonctionnera pas pour 'DateTime()' (et votre format dans createFromFormat est incorrect). Je recommande d'utiliser une expression régulière pour séparer cette chaîne de date dans les parties dont vous avez besoin. De là, le reste de votre code devrait fonctionner. –

Répondre

1

Votre approche est erronée, dans la première ligne de votre fonction vous essayez de convertir votre date portugais comme si elle est au format Ymd si votre objet $date est imparfait pour commencer. Ce que vous devriez probablement faire (en supposant qu'il n'y ait pas de fonction localisée pour convertir les dates portugaises en DateTime ...), utilisez quelque chose comme une chaîne de remplacement pour remplacer tous les mots portugais par des mots anglais et ensuite utilisez votre conversion originale :

$date = DateTime::createFromFormat('l, j F, Y', $translated_date); 

Les 17/34 mots concernés ne gênent pas les uns des autres si str_ireplace() avec deux tableaux devraient le faire.

+0

Merci, il semble une bonne solution, je ne savais pas cette fonction, mais il semble être une bonne solution. Mais j'ai la même erreur que ma fonction convertDate(). – OzzC

+1

@OzzC Vous avez également oublié d'ajouter les mois. Et après la traduction, vous devriez faire 'var_dump ($ result);' pour vérifier que c'est ce que vous attendez d'elle. – jeroen

+0

Merci, j'oublie vraiment les mois! Et maintenant je pense Im plus proche, mais Im ayant une erreur "erreur fatale Catchable: objet de classe DateTime ne peut pas être converti en chaîne dans ma ligne sql $ insertNews-> bindValue (': date', $ date) ;. Mais je déjà useDateTime :: format pour obtenir une chaîne formatée Savez-vous pourquoi cette erreur peut se produire? – OzzC

2

Au lieu d'essayer de traduire les dates en mots éventuellement différentes langues, vous pouvez avoir JQuery déposer une UTC de toutes sortes dans un champ caché et travailler avec ceci:

Ceci renvoie un objet date JS:

var currentDate = $(".selector").datepicker("getDate"); 

Cela en fera un PHP UTC (c'est microsecondes dans JS ...)

var phputc = Math.ceil((currentDate.getTime()/1000)); 

Cela mis en sous une forme cachée:

$(".selector").change(
     function() 
     { 
      var currentDate = $(".selector").datepicker("getDate"); 
      var phputc = Math.ceil((currentDate.getTime()/1000)); 
      document.forms[0].nameofhiddenformfield.value = phputc; 
     } 
    ); 

Assurez-vous qu'il est un domaine comme celui-ci dans votre formulaire

<input type="hidden" name="nameofhiddenformfield" /> 

Et du côté de PHP, vous pouvez alors faire:

$dateUTC = $_POST['nameofhiddenformfield']; 
    echo date('Y-m-d',$dateUTC); 
+0

+1 Certainement une meilleure solution – jeroen

+0

Merci pour votre solution, mais Im étrangement Im obtenant cette erreur: date() s'attend à ce que le paramètre 2 soit long, chaîne donnée po. Quand je fais écho date ('Ym-d', $ dateUTC); – OzzC

+0

CAn vous dumping $ dateUTC? Peut-être juste une question de coulée ... –

Questions connexes