web-dev-qa-db-ja.com

2番目の例でDateTime :: createFromFormat()が失敗してブール値を返すのはなぜですか?

これを実行すると、最初のものが日付に正しく作成されます。 2番目のものは失敗し、booleanを返すため、フォーマットできません。時間は範囲外ですか?

//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

小さいものは12時間形式で、大きいものは24時間形式であるため、hを大きなHに変更します。

manual ですべての形式を確認できます。そしてそこからの引用:

h 12時間形式、先頭に0から12までのゼロ
H 24時間形式の先行ゼロ00〜23

12時間形式には15がないため、現在コードは失敗しています。

14
Rizier123

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

他の回答に加えて、DateTimeが理解する標準形式の場合、形式から作成する必要はありません。

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