web-dev-qa-db-ja.com

TwigテンプレートでDateTimeオブジェクトをレンダリングする方法

私のエンティティの1つにある私のフィールドの1つは "datetime"変数です。

このフィールドをブラウザに表示するための文字列に変換するにはどうすればよいですか。

これがコードスニペットです。

{% 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;

そして、これは私が得ているエラーメッセージです:

テンプレートのレンダリング中に例外がスローされました( "Catchable Fatal Error:DateTimeクラスのオブジェクトを...\app\cache\dev\twig\9b\ad\58fd3bb1517632badf1fdc7fa4a8.php line 33" 10行目の "BeerBundle:Games:gameTable.html.twig"の中。

201
Chris Ridmann

あなたは使用することができますが

{{ game.gameDate|date('Y-m-d') }}

このバージョンでは、1つの国籍のユーザーだけが使用するサイトでは問題にならないようにする必要があります。 \DateTimeクラスを拡張し、それにロケールをチェックしてそれに応じて動作する__toString()メソッドを追加するなど、国際的なユーザーはゲームの日付をまったく異なるものに表示する必要があります。

編集

コメントで@Nicによって指摘されているように、 Twigの国際拡張 を使用すると、利用可能なlocalizeddateフィルタが利用可能になります。これはユーザのロケールでの日付を示します。このようにして、\DateTimeを拡張するという私の以前の考えをやめることができます。

283
GergelyPolonkai

date filterを使うことができます。

{{ game.gameDate|date("m/d/Y") }}
87
Ondrej Slinták

日付を表示する形式によって異なります。

静的日付フォーマット

すべてのロケールで同じ静的フォーマットを表示したい場合(例えば、Atomフィードの場合は ISO 8601 )、Twigの date filter を使用してください。

{{ game.gameDate|date('Y-m-d\\TH:i:sP') }}

これは常に以下のフォーマットで日時を返します。

2014-05-02T08:55:41Z

dateフィルタが受け付けるフォーマット文字列は、 PHPのdate()関数 に使用するものと同じです。 (唯一の違いは、私が知る限り、PHP date()関数で使用できる定義済み定数は使用できないことです)

ローカライズされた日付(と時間)

ただし、ブラウザでレンダリングしたいので、ユーザーの言語と場所に合わせてローカライズされた、人間が読める形式で表示したいと思うでしょう。ローカライゼーションを自分で行う代わりに、(PHPの IntlDateFormatter を利用するために) Intl Extension を使用することができます。ローカライズされた形式を使用して日付と時刻を出力するフィルタlocalizeddateが用意されています。

localizeddate( date_format, time_format [, locale ] )

localizeddateの引数:

  • date_formatフォーマット文字列 の1つ(下記参照)
  • time_formatフォーマット文字列 の1つ(下記参照)
  • locale :(オプション)設定されたロケールを上書きするためにこれを使用します。 symfonyの設定で設定できるデフォルトロケールを使用するにはこの引数を省略してください。

(他にもあります、考えられる引数の完全なリストは docs を参照してください)

date_formatおよびtime_formatには、以下のいずれかの文字列を使用できます。

  • この要素を含めたくない場合は'none'
  • 最も省略されたスタイルの場合は'short'(英語のロケールでは12/13/52または午後3時30分)
  • ミディアムスタイルの'medium'(英語ロケールで1952年1月12日)
  • ロングスタイルの場合は'long'(1952年1月12日または英語のロケールで午後3時30分32秒)
  • 完全に指定されたスタイルの場合は'full'(西暦1952年4月12日火曜日、または英語のロケールで午後3時30分42秒PST)

たとえば、February 6, 2014 at 10:52 AMと同等の形式で日付を表示したい場合は、Twigテンプレートで次の行を使用します。

{{ game.gameDate|localizeddate('long', 'short') }}

ただし、別のロケールを使用すると、結果はそのロケールにローカライズされます。

  • nlロケールの場合は6 februari 2014 10:52
  • frロケールの場合は6 février 2014 10:52
  • deロケールの場合は6. Februar 2014 10:52。等.

ご覧のとおり、localizeddateは月名を翻訳するだけでなく、ローカル表記も使用します。英語表記は月の後に日付を置きます。オランダ語、フランス語、ドイツ語の表記は月の前に置きます。英語とドイツ語の月名は大文字で始まりますが、オランダ語とフランス語の月名は小文字です。そしてドイツの日付にはドットが追加されています。

インストール/ロケール設定

Intlエクステンションのインストール方法は この別の答え にあります。

65
Nic Wortel

忘れないで

@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

3
Ivan
{{game.gameDate | date('c')}}  // 2014-02-05T16:45:22+00:00

タイムゾーンオフセットを含む完全な日付時刻文字列。

2
Venkat Kotra

次のようにレンダリングすることができます

{{post.published_at |日付( "m/d/Y")}}

詳細については http://twig.sensiolabs.org/doc/filters/date.html をご覧ください。

2
Zaheer Babar

現在のロケールで日付を表示するための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

https://github.com/michelsalib/BCCExtraToolsBundle

2
ihsan

これはかなり古い質問ですが、今日この質問を見つけましたが、答えは私が必要としていたものではありませんでした。

だからここに私は必要なものです。

あなたが私のように現在の日付を小枝で表示しようとしているのなら、以下:

{{ "now"|date("m/d/Y") }}

これに関するドキュメントを参照してください。

小枝の中の日付

1
Refilon