2012-10-05 12 views
7

DBテーブルでは、フィールドタイプとしてdatetimeといういくつかのフィールドがあります。ですから、データを日付のオブジェクトとしてのみ保持する必要があります。私はsymfony2/phpのstringからDateTimeオブジェクトを作成するには

2012-10-05 17:45:54 

のような文字列として日付時刻を取得し、フォームから

は今、私は私のエンティティを永続化これまでとき、私はエラー以下の取得:

Fatal error: Call to a member function format() on a non-object in ..\DateTimeType.php on line 44

私は

$protocol->setStartedAt(strtotime($post['started_at'])); 

てみましたまたは

$from = \DateTime::createFromFormat('yy-mm-dd hh:mm:ss', $post['started_at']); 
$protocol->setStartedAt($from); 

か、単に

$from = new \DateTime($post['started_at']); 
$protocol->setStartedAt($from); 

最後のコードは動作しますが、それはarguementとして渡されたタイムスタンプを使用していますが、ただ、現在の時刻を取得していません。

アイデア?

+0

'$ post ['started_at']'にはあなたが望むものが含まれていますか?それは '$ _POST ['started_at']'ではないのですか? –

+0

また、 'DateTime'オブジェクトとメソッドはエラー時に例外をスローします。あなたはそれらのどれも手に入れませんか? 'try/catch'を使ってみてください。 –

答えて

12

私は常にそのコンストラクタでDateTimeオブジェクトを作成し、OSお使いの場合には、それは次のようになります。これが動作するかどうか

$protocol->setStartedAt(new \DateTime($post['started_at'])); 

が、タイムスタンプは、おそらくやる掲載使用していません$ post ['started_at']に値がありません。 、(あなたは、「文字列からsymfonyの2日時を」Googleの場合、これは最初の投稿です)確実はいつか、この問題が発生します将来の読者のために

die($post['started_at']); 
+0

さらにデバッグ: 'new DateTime()'の結果である 'var_dump'とfalseの場合、詳細は 'var_dump(\ DateTime :: getLastErrors())'を参照してください。 http://php.net/manual/en/datetime.getlasterrors.php – yoshi

+0

なぜバックスラッシュですか? symfonyはそれを解釈しませんか? – meles

+0

DateTimeに '' 'use'''文を追加すると、バックスラッシュは必要ありません。それ以外の場合は、クラスへのフルパスを宣言する必要があります。この場合、デフォルトの名前空間にあり、バックスラッシュのみが必要です。 –

1

createFromFormatはどうですか?

http://uk.php.net/manual/en/datetime.createfromformat.php

$from = DateTime::createFromFormat($post['started_at'], 'Y-m-d H:i:s'); 
+0

申し訳ありませんが、あなたは既にこれを持っていることを見て - フォーマットが正しくないので動作しません。リンクされたページを使用して、フォーマットを正確に一致させてみてください - それはPHPのフォーマットであり、奇妙なSymfonyのものではありません... – watermanio

+0

Nopeはまだこのエラーを受けていません。オブジェクトでないDateTimeType.php行44 –

+0

上記の解決策はfalseです。正しい解決策= '$ from = \ DateTime :: createFromFormat( 'Ymd H:i:s'、$ post ['started_at']);' –

8

:それをデバッグの試しか、単に汚いトリックを行いますSymfony 2では、DateTimeオブジェクトはそのフォーマットの文字列を受け入れないことを覚えておいてください:"d/m/Y H:i:s"、おそらく他の多くのものもサポートしていません。

まず、何からあなたの日付文字列を取得する:その時怒っになってきていないのために、私は実際にこのようなエラーを回避するための最も簡単で安全な解決策はこの1つであることを

を見つけました(私の場合はジェネリックAJAXリクエストで)DateTimeオブジェクトに変換すると、この例では、jQuery UIのフォーマットである25/04/2015 15:00のdateTimeオブジェクトを作成する必要があると想定しています。italian DateTimePickerこれは単なる例です)。

$literalTime = \DateTime::createFromFormat("d/m/Y H:i","25/04/2015 15:00"); 

(注:他にあなたがあなたの例外がスローされますsymfonyのdatetimeオブジェクトを使用することになり、PHPのDateTimeオブジェクトを使用するように\を使用)、あなたがそれをやったら

すると、快適さを使用して日付文字列を作成最初のパラメータに期待される出力形式(Y-m-d H:i:s)を与えることによって、形式機能、:

$expire_date = $literalTime->format("Y-m-d H:i:s"); 

あなたが合格または受信されている形式のどんな種類の本が適切にconveになることを100%確信している。このようにあなたが入力として期待しているものを提供している限り、DateTime symfonyオブジェクトから何らかの例外を受け取ることはありません

この投稿は実際にはかなり古いことを知っているので、私は他の貴重な情報源を見つけることができなかったので、これを投稿することにしました。

最高の解決策は、まだ正しい形式でdatetime文字列を送信することですが、文字通りそのような文字列を変換する最も安全な方法はありません。

関連する問題