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


215

エンティティの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 \ twig \ 9b \ ad \ 58fd3bb1517632badf1fdc7fa4a8.php行33で文字列に変換できませんでした」 ) "BeerBundle:Games:gameTable.html.twig"の10行目

回答:


305

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

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

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

編集

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


45
{{ game.gameDate|date('Y-m-d H:i:s') }}日付と時刻。数分間キャラクターを見つけるのに問題がありました。
murko 2013年

6
Twigの日付関数は、php関数(Twigドキュメントから)と同じ形式を使用します。他のフォーマットを探している人のために、php.net/manual/en/function.date.php
JonnyS 2014年

9
null値に注意してください。同様の使用例で、null値をTwigのdate関数にパイプするときに今日の日付が表示されます。あなたの例に基づいて、あなたはそれをラップする必要があります{% if game.gameDate is not empty %} ... {%endif}
ファジー

4
ローカリゼーションに関しては、DateTimeクラスを拡張するべきではありません!代わりに、Twig localizeddateフィルターを使用してください
Nic Wortel 2014年

1
{% if game.gameDate %} {{ game.gameDate|date('Y-m-d H:i:s') }} {% endif %}推奨されます
Dheeraj

90

dateフィルターを使用できます:

{{ game.gameDate|date("m/d/Y") }}

3
完全に同意します。これはデフォルトで存在するはずです。
tftd 2012

2
@ThomasDecauxこれは実際にはそれほど奇妙なことではありません。__toString()メソッドはDateTimeオブジェクトをどの形式に変換するかを知る必要があり、おそらく数百の可能な形式がそこにあるからです。もちろん、PHP では、フォーマット引数を取るオブジェクトに対してformat()メソッドを使用できます。フィルターは、そのメソッドに相当するTwigです。DateTimedate
Nic Wortel 2014年

68

日付の表示形式に依存します。

静的な日付形式

すべてのロケールで同じである静的フォーマット(たとえば、AtomフィードのISO 8601)を表示する場合は、Twigのdateフィルターを使用する必要があります。

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

常に次の形式で日時を返します。

2014-05-02T08:55:41Z

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

ローカライズされた日付(および時刻)

ただし、ブラウザでレンダリングする必要があるため、ユーザーの言語と場所に合わせてローカライズされた、人間が読める形式で表示することをお勧めします。自分でローカライズを行う代わりに、これにIntl拡張機能を使用できます(これはPHPのIntlDateFormatterを利用します)。localizeddateローカライズされた形式を使用して日付と時刻を出力するフィルターを提供します。

localizeddate( date_format, time_format [, locale ] )

の引数localizeddate

  • date_format書式文字列の 1つ(下記参照)
  • time_format書式文字列の 1つ(下記参照)
  • locale:(オプション)これを使用して、構成されたロケールをオーバーライドします。デフォルトのロケールを使用するには、この引数を省略します。デフォルトのロケールは、Symfonyの構成で構成できます。

(もっとあります可能な引数の完全なリストについてはドキュメントを参照してください)

date_formatしてtime_format、あなたは、次のいずれかの文字列を使用することができます。

  • 'none' この要素を含めたくない場合
  • 'short' 最も省略されたスタイル(英語のロケールでは12/13/52または3:30 pm)
  • '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') }}

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

  • 6 februari 2014 10:52以下のためのnlロケール。
  • 6 février 2014 10:52以下のためのfrロケール。
  • 6. Februar 2014 10:52以下のためのdeロケール。等

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

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

Intl拡張機能のインストール手順は、この別の回答にあります。


1
ローカライズされた日付(および時刻)-この@Nicに感謝します-すごい!
webDEVILopers 2014年

こんにちは、localizeddateを使用して、MとY(日ではない)だけを出力する方法を知っていますか?thks
マリオ

3

忘れないで

@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


2

現在のロケールで日付を表示する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
{{game.gameDate | date('c')}}  // 2014-02-05T16:45:22+00:00

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



1

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

だからここに私が必要なものがあります。

あなたは、場合私のように、表示するように求めている現在の小枝の日付を、次のように使用することができます。

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

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

小枝の日付


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.