2013-03-27 16 views
15

私は開始日と終了日を持つエンティティを持っています。日付差は

twigを使って時間差をつけることはできますか?

答えて

12

これを行うための組み込み関数はありませんが、簡単に自分で行うことができます。extending twigは簡単です!

quick'n'easy方法は、小枝の簡単な関数のクラスでそれを行うことです。

$function = new Twig_SimpleFunction('date_difference', function ($start, $end) { 
    // ... calculate difference and return it 
}); 

// assuming $twig is an instance of Twig_Environment 
$twig->addFunction($function); 

再利用可能な方法は、(同じリンク上で文書化)小枝の拡張機能を作成することです。それはまだ簡単です。

50

PHP 5.3以降では、拡張子を書き込まないと別のオプションがあります。

この例では、複数の日/日

{# endDate and startDate are strings or DateTime objects #} 
{% set difference = date(endDate).diff(date(startDate)) %} 
{% set leftDays = difference.days %} 
{% if leftDays == 1 %} 
    1 day 
{% else %} 
    {{ leftDays }} days 
{% endif %} 

説明カルクする方法を示し:

をPHP 5.3 DateTime目的はendDatebeginDate 小枝間の結果の差がDateIntervalオブジェクトを返すdiff()方法を有しています

twig date関数は常にを返します。オブジェクトdiffメソッド

最後にDateIntervalオブジェクトのプロパティにアクセスしたり、Twig dateフィルタでその書式を設定したりできます。

注:変数がすでにDateTimeオブジェクトである場合date機能付きラップendDateまたはstartDateの必要はありません。

注2:DateTimeは、ここでは同義語DateTimeInterfaceとして使用されています。

+3

これは、日付の差がヶ月以上あることを行っているがあれば、夢のような仕事の代わり.Dの.daysを使用しない、唯一.D日の部分を返します。つまり、差が1か月、1日の場合は.dは1になりますが、日は32日(31日の月を仮定)です。 '{%set leftDays = difference.days%}' –

+0

誕生日を取得するには{{date()。diff(date(item.birth)}。}} – dikirill

+0

しかし開始日と終了日の両方の位置になります一日で1日残っている(+1)、または1日以上(-1)かどうかをどうやって決めるのですか? – Pathros

2

Sensio LabsのDate extensionにはtime_diffフィルタがあります。

その後、あなたはこのようにそれを使用することができます:{{ entity.ending_date|time_diff(entity.starting_date) }}