web-dev-qa-db-fra.com

Pourquoi DateTime :: createFromFormat () échoue et renvoie un booléen dans mon deuxième exemple?

Lorsque je lance cela, le premier est correctement créé dans une date. Le second échoue, renvoyant un boolean et je ne peux donc pas formater. Le temps est-il hors de portée?

//works correctly
$startDate = "2015-05-06 10:49:20.637133";
$start = DateTime::createFromFormat('Y-m-d h:m:s.u',$startDate);
echo $start->format('m/d/y');

//doesn't work correctly
$startDate = "2015-05-12 15:49:06.821289";
$start = DateTime::createFromFormat('Y-m-d h:m:s.u',$startDate);
echo $start->format('m/d/y');

Code to reproduce the error

14
depperm

Changez le h en un gros H, car le petit est au format 12 heures et le grand au format 24 heures.

Vous pouvez voir tous les formats dans le manuel . Et une citation de là:

h Format 12 heures d'une heure avec des zéros de tête de 01 à 12
H Format 24 heures d'une heure avec des zéros en tête 00 à 23

Signifie en ce moment que votre code échoue, car il n'y a pas de 15 au format 12 heures.

14
Rizier123

Vérifiez DateTime::getLastErrors():

php > var_dump(DateTime::createFromFormat('Y-m-d h:m:s',"2015-05-12 15:49:06"));
bool(false)

php > var_dump(DateTime::getLastErrors());
array(4) {
  ["warning_count"]=>
  int(1)
  ["warnings"]=>
  array(1) {
    [19]=>
    string(27) "The parsed date was invalid"
  }
  ["error_count"]=>
  int(1)
  ["errors"]=>
  array(1) {
    [11]=>
    string(30) "Hour can not be higher than 12"
18
Marc B

En plus des autres réponses, pour les formats standard compris par DateTime, vous n'avez pas besoin de créer à partir d'un format:

$startDate = "2015-05-12 15:49:06.821289";
$start = new DateTime($startDate);
echo $start->format('m/d/y');
3
AbraCadaver