2013-03-27 14 views

risposta

12

Non esiste una funzione incorporata per farlo, ma è possibile farlo facilmente da soli, extending twig è facile!

Il modo quick'n'easy è quello di farlo con classe semplice funzione di ramoscello:

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

Il modo riutilizzabile è quello di creare un'estensione ramoscello (documentato sullo stesso collegamento). È ancora facile.

50

Da PHP 5.3 C'è un'altra opzione senza scrivere un'estensione.

Questo esempio mostra come Calc i plurali giorno/giorni

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

Spiegazione:

PHP 5.3 DateTime oggetto ha diff() metodo che restituisce un oggetto DateInterval con la differenza risultato tra il endDate e beginDate Twig

Twig date funzione sempre restituire un DateTime oggetto in modo che possiamo chiamare il metodo diff

Infine possiamo accedere alle proprietà dell'oggetto DateInterval o formattarlo con il filtro Twig date.

Nota: Non c'è bisogno di avvolgere endDate o startDate con la funzione date se la variabile è già un oggetto DateTime.

Nota2: DateTime viene qui utilizzato come sinonimo di DateTimeInterface.

+3

Questo funziona come un sogno, se la differenza tra le date sta per essere più di un mese, l'uso .days invece di .d, .D solo restituisce la parte dei giorni, cioè se la differenza è 1 mese, 1 giorno, .d sarebbe 1, ma .giorni sarebbe 32 (supponendo un mese di 31 giorni). '{% set leftDays = difference.days%}' –

+0

Per ottenere la data di nascita {{date(). Diff (date (item.birth).)}} – dikirill

+0

Ma entrambe le posizioni di entrambe le date di inizio e di fine risulteranno in un giorno. Come si determina se rimane un giorno (+1) o un giorno (-1) ??? – Pathros

2

Si noti inoltre che esiste uno Date extension esistente da Sensio Labs che offre un filtro time_diff.

Quindi è possibile utilizzare in questo modo: {{ entity.ending_date|time_diff(entity.starting_date) }}