32
Help us understand the problem. What are the problem?

More than 5 years have passed since last update.

posted at

updated at

twigでイケてるDateTimeの比較の仕方

意外とネット上にイケてる情報がないので書きます。

ネット上だとよく以下のようなdateフィルターを用いたイケてない文字列比較をやっちゃっているのを見かけます。

例)キャンペーンが開始していない場合

{% if campaign.startDate|date('Y-m-d') > "now"|date('Y-m-d') %}
まだ開始していません。
{% endif %}

もちろんこれでも動きます。動きますが、文字列の大小を比較するのは何かが違う気がします。最近のtwig(1.6以降)ではdate関数がありますし、スマートにDateTimeオブジェクト同士を比較すればいいと思います。
【参考】
twig date関数ドキュメント

{% if campaign.startDate > date() %}
まだ開始していません。
{% endif %}

Twigのdate関数のコードの実装を見てみると分かるのですが、内部的にDateTimeオブジェクトを生成しています。

また、twigのdate()引数を渡すとDateTimeにコンストラクター引数を渡すことになるので、「特定の日付より前なら」という条件文も簡単に書けます。

例)2013-06-02より前だったら表示

{% if campaign.startDate < date('2013-06-02 00:00:00') %}
まだ開始していません。
{% endif %}

ここまで書いておいてなんですが、テンプレート内で日時の比較を行う方法を紹介しましたが、もし他のところでも頻繁に使われる重要なロジックなのであれば、Campaign->isStarted() のようにpublicメソッドをEntity側に用意した方が良いとは思います。

あとはお好みでどうぞ。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
32
Help us understand the problem. What are the problem?