2017-05-31 18 views
-2

Symfony CRMでBootstrap Date Range Pickerを実装しています。特定のホリデーシーズンの日付範囲を選択するためです。Symfonyで日付を書式設定する際の問題

ただし、データをデータベースに追加するには、開始日と終了日の形式である必要があります。データベースはDateTimeオブジェクトを予期していますが、クライアントのフロントエンドで読みやすくする必要があります。

これは、バックコントローラ一度提出に何が渡されるかされています。私はこれを取得するデータベースに永続化する場合を除き

$dates = $form['startDate']->getData(); 
$date_bits = explode(" - ",$dates); 
$startDate = \DateTime::createFromFormat('Y-m-d',$date_bits[0]); 
$endDate = \DateTime::createFromFormat('Y-m-d',$date_bits[1]); 

:私のコントローラで

20/5/2017 - 20/7/2017

、私は次のコードを使用しますエラー:

Fatal error: Call to a member function format() on boolean in /vendor/doctrine/dbal/lib/Doctrine/DBAL/Types/DateTimeType.php on line 53

だから私は代わりにこの方法を試しました:

$startDate = new \DateTime(str_replace("/","-",$date_bits[0])); 
$endDate = new \DateTime(str_replace("/","-",$date_bits[1])); 
$startDate = $startDate->format('Y-m-d'); 
$endDate = $endDate->format('Y-m-d'); 

しかし、私は同じエラーが表示されます。私はここで間違って何をしていますか?

EDIT:実際には2番目のコードブロックでエラーが発生しました。文字列にformat()が呼び出されています。あなたはこのしてくださいしてみてくださいCreateFromFormat使用したい場合は

$startDate = new \Datetime($date_bits[0]); 
$endDate = new \Datetime($date_bits[1]); 

通常の日付と
+0

''のDateTime :: createFromFormat( 'D/M/Y')との何が問題なのですか? [strftime()で理解できる日付と時刻の形式](http://php.net/manual/en/datetime.formats.php)を読んでください。 – axiac

+0

日付フィールドに期待されるように 'Y-m-d'のようなデータベースに入る必要があります。 –

+0

'DateTime :: createFromFormat( 'd/m/Y'、$ date_bits [0]) - > format( 'Y-m-d') ' –

答えて

1

のDateTime :: createFromFormat手段表すどんな文字列ことあなたが提出した日付があなたが提供したフォーマットと一致しません。

DateTime :: createFromFormatの最初のパラメータは、提出する書式(この場合は「d/m/Y」)である必要があります。次に、$ startDate-> format( 'Y-m-d')を実行して、希望通りにフォーマットされた日付を取得できます。

$dates = $form['startDate']->getData(); 
$date_bits = explode(" - ",$dates); 
$startDate = \DateTime::createFromFormat('d/m/Y',$date_bits[0])->format('Y-m-d'); // 2017-05-20 
$endDate = \DateTime::createFromFormat('d/m/Y',$date_bits[1])->format('Y-m-d'); // 2017-07-20 

NB:DateTimeオブジェクトのままにしたい場合は、> format()を使用しないでください。 Formatは常に文字列を返します。

+0

あなたの$ datesは実際に'20の文字列/ 5/2017 - 20/7/2017 '?私はちょうど上記のコードを自分でテストし、うまくいきました。 –

+0

はい、うまくいきました - 申し訳ありませんが、私はPHP Sandboxで遊んでいて、フォーマットを一時的に変更しました!ありがとうございます –

+0

ようこそ。 –

1

私はこれを使用していfalseを返す)(

$startDate = new \DateTime::createFromFormat('d/m/Y', $date_bits[0])->format('Y-m-d'); 
$endDate = new \DateTime::createFromFormat('d/m/Y', $date_bits[1])->format('Y-m-d'); 
+0

残念ながら私は同じエラーを受けます。 '$ date_bits'の出力は次の通りです:' Array([0] => 01/02/2017 [1] => 30/04/2017) ' –

0

エラーメッセージ:

Fatal error: Call to a member function format() on boolean in /vendor/doctrine/dbal/lib/Doctrine/DBAL/Types/DateTimeType.php on line 53

は(具体的には、FALSEDateTimeオブジェクトが、ブール値ではない何かにDateTime::format()を呼び出そうとしたコードによって生成されます。

実際には$startDateの値で、DateTime::__construct()によって返され、入力文字列の解析方法はわかりません。

20/5/2017のような日付を渡します。明らかにそのフォーマットは'd/m/Y'です。

DateTime::__construct()およびstrftime()はわかりません。彼らはm/d/YまたはY/m/dのいずれかを期待しています。d/m/Yをヒントなしでm/d/Yから分けることは不可能であり、PHPプログラマはd/m/Yを無視することを選択しました。これはm/d/Yがより多く使用されるためです。

ただし、日付&の時刻形式は直接理解できないため、常に関数DateTime::createFromFormat()が存在します。これにより、文字列に検索する日付と時刻の順番をエンジンに知らせることができます。&

あなたがしなければならないのは、それを適切に使用することです:

$startDate = \DateTime::createFromFormat('d/m/Y',$date_bits[0]);