Twig テンプレートで DateTime オブジェクトをレンダリングする方法
質問
私のエンティティの 1 つにあるフィールドの 1 つは「日時」変数です。
このフィールドをブラウザで表示する文字列に変換するにはどうすればよいですか?
コードスニペットは次のとおりです。
{% for game in games %}
...
<td> {{game.gameTeamIdOne.teamName}} </td>
<td> {{game.gameTeamIdTwo.teamName}} </td>
<td> {{game.gameDate}}</td>
</tr>
{% endfor %}
私のエンティティクラスの変数は次のとおりです。
/**
* @var date $gameDate
*
* @ORM\Column(name="GAME_DATE", type="datetime", nullable=true)
*/
private $gameDate;
そして、これが私が受け取るエラーメッセージです:
テンプレートのレンダリング中に例外がスローされました (「キャッチ可能な致命的なエラー:クラス DateTime のオブジェクトを、...\app\cache\dev wig\9b\ad\58fd3bb1517632badf1fdc7fa4a8.php 行 33") の "BeerBundle:Games:gameTable.html.twig" 行 10 の文字列に変換できませんでした。
解決
ただし、使用できます
{{ game.gameDate|date('Y-m-d') }}
アプローチは、このバージョンはユーザーのロケールを尊重しないことに留意してください。これは、1つの国籍のユーザーのみが使用するサイトで問題ではないはずです。国際的なユーザーは、拡張のように、ゲームの日付をまったく異なるものに表示する必要があります \DateTime
クラス、および追加 __toString()
ロケールをチェックし、それに応じて動作する方法。
編集:
コメントで@nicが指摘したように、あなたが使用する場合 小枝のINTL拡張, 、あなたは持っています localizeddate
使用可能なフィルター。ユーザーのロケールに日付が表示されます。このようにして、あなたは私の以前の拡張のアイデアをドロップすることができます \DateTime
.
他のヒント
使用できます date
フィルター:
{{ game.gameDate|date("m/d/Y") }}
日付を表示する形式に依存します。
静的日付形式
静的形式を表示する場合は、すべてのロケールで同じです(たとえば ISO 8601 原子フィードの場合)、小枝を使用する必要があります date
フィルター:
{{ game.gameDate|date('Y-m-d\\TH:i:sP') }}
これは常に次の形式でDateTimeを返します。
2014-05-02T08:55:41Z
によって受け入れられた形式の文字列 date
フィルターは使用するものと同じです PHPの date()
関数. 。 (唯一の違いは、私の知る限り、PHPで使用できる定義済み定数を使用できないことです。 date()
関数)
ローカライズされた日付(および時間)
ただし、ブラウザでレンダリングするため、ユーザーの言語と場所にローカライズされた人間の読み取り可能な形式で表示することをお勧めします。自分でローカリゼーションを行う代わりに、 INTL拡張 このため(PHPを使用しています intldateformatter)。フィルターを提供します localizeddate
ローカライズされた形式を使用して日付と時刻を出力します。
localizeddate( date_format, time_format [, locale ] )
の議論 localizeddate
:
date_format
: : 一つ フォーマット文字列 (下記参照)time_format
: : 一つ フォーマット文字列 (下記参照)locale
: :(オプション)これを使用して、構成されたロケールをオーバーライドします。この引数を残して、Symfonyの構成で構成できるデフォルトのロケールを使用してください。
(もっとあります、参照してください ドキュメント 考えられる議論の完全なリストのために)
為に date_format
と time_format
次の文字列のいずれかを使用できます。
'none'
この要素を含めたくない場合'short'
最も短縮されたスタイル(英語の場所で12/13/52または午後3時30分)'medium'
ミディアムスタイル(1952年1月12日英語のロケール)'long'
長いスタイル(1952年1月12日または英語の場所で午後3時30分)'full'
完全に指定されたスタイル(1952年4月12日火曜日、または英語の場所で午後3時30分42分)
例
したがって、たとえば、日付を次の形式で表示する場合は、 February 6, 2014 at 10:52 AM
, 、小枝テンプレートで次の行を使用します。
{{ game.gameDate|localizeddate('long', 'short') }}
ただし、別のロケールを使用する場合、結果はそのロケールに対してローカライズされます。
6 februari 2014 10:52
のためにnl
ロケール;6 février 2014 10:52
のためにfr
ロケール;6. Februar 2014 10:52
のためにde
ロケール;等
ご覧のように、 localizeddate
月の名前を翻訳するだけでなく、ローカル表記も使用します。英語の表記は、オランダ語、フランス語、ドイツ語の表記が月の前にそれを置く月の後の日付を置きます。英語とドイツの月の名前は大文字から始まりますが、オランダ語とフランスの月の名前は小文字です。ドイツの日付にはドットが追加されています。
ロケールのインストール /設定
INTL拡張のインストール手順は、 この別々の答え.
忘れないで
@orm haslifecyclecallbacks()
実在物 :
/**
* Set gameDate
*
* @ORM\PrePersist
*/
public function setGameDate()
{
$this->dateCreated = new \DateTime();
return $this;
}
意見:
{{ item.gameDate|date('Y-m-d H:i:s') }}
>>出力2013-09-18 16:14:20
現在のロケールで日付を表示する symfony2 ツールがあります。
{{ user.createdAt|localeDate }} to have a medium date and no time, in the current locale
{{ user.createdAt|localeDate('long','medium') }} to have a long date and medium time, in the current locale
{{game.gameDate | date('c')}} // 2014-02-05T16:45:22+00:00
タイムゾーンオフセットを含むフルデートタイムストリングの場合。
次の方法でレンダリングできます
{{post.published_at | date( "m/d/y")}}
詳細については、ご覧ください http://twig.sensiolabs.org/doc/filters/date.html
私はこれがかなり古い質問であることを知っていますが、今日この質問を見つけましたが、答えは私が必要としていたものではありませんでした。
これが私が必要としていたものです。
もし、あんたが、 私のような, 、表示しようとしています 現在 小枝の日付、以下を使用できます。
{{ "now"|date("m/d/Y") }}
これに関するドキュメントを参照してください: