2013-03-27 10 views

Odpowiedz

12

Nie ma wbudowanej funkcji do tego, ale można to łatwo zrobić samodzielnie, extending twig jest łatwe!

quick'n'easy sposobem jest zrobić to z prostego klasy funkcji gałązka za:

$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); 

wielokrotnego użytku sposobem jest stworzenie rozszerzenia gałązka (udokumentowaną na tym samym łączu). To nadal jest łatwe.

50

Od PHP 5.3 Istnieje inna opcja bez pisania rozszerzenia.

Ten przykład pokazuje, jak calc mnogiej dzień/dni

{# 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 %} 

Objaśnienie:

PHP 5.3 DateTime obiekt ma diff() metodę, która zwracać DateInterval obiekt z różnicy wyników pomiędzy endDate i beginDate Twig

Twig date funkcja zawsze zwraca wartość DateTime obiekt, więc możemy nazwać diff metoda

Wreszcie możemy uzyskać dostęp do właściwości obiektu DateInterval lub sformatować go z filtrem Twig date.

Uwaga: Nie ma potrzeby opasania endDate lub startDate z funkcją date jeśli zmienna jest już DateTime przedmiot.

Uwaga 2: DateTime jest tutaj używany jako synonim nazwy DateTimeInterface.

+3

To działa jak marzenie, ale jeśli różnica pomiędzy datami będzie więcej niż miesiąc, stosowanie .days zamiast .d, .D tylko zwraca część dni, tzn. jeśli różnica wynosi 1 miesiąc, 1 dzień, .d będzie 1, ale dzień będzie wynosił 32 (przy założeniu 31 dniowego miesiąca). '{% zestaw leftDays = difference.days%}' –

+0

Aby otrzymać datę urodzin {{date(). Diff (data (item.birth)). Y}} – dikirill

+0

Ale zarówno pozycja daty początkowej i końcowej spowoduje w jeden dzień. Jak ustalić, czy jest to jeden dzień w lewo (+1), czy jeden dzień nad (-1) ??? – Pathros

2

Należy również pamiętać, że istnieje istniejący Date extension od Sensio Labs, który oferuje filtr time_diff.

Wtedy można go używać tak: {{ entity.ending_date|time_diff(entity.starting_date) }}

Powiązane problemy