Twig date difference

There's no built-in function to do that, but you can easily do it yourself, extending twig is easy!

The quick'n'easy way is to do it with twig's simple function class:

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

The reusable way is to create a twig extension (documented on the same link). That's still easy.


Also note there is an existing Date extension from Sensio Labs that offer a time_diff filter.

Then you can use it like this:{{ entity.ending_date|time_diff(entity.starting_date) }}

Please note that this plugin is abandonned and not supported with Twig 3 : https://packagist.org/packages/twig/extensions


Since PHP 5.3 There is another option without to write an extension.

This example show how to calc the plural day/days

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

Explanation:

PHP 5.3 DateTime object has diff() method which return a DateInterval object with the result difference between endDate and beginDate Twig

Twig date function always return a DateTime object so we can call diff method

Finally we can access to the properties of the DateInterval object or format it with the Twig date filter.

Note: There is no need of wrap endDate or startDate with the date function if the variable is already a DateTime object.

Note2: DateTime is used here as a synonym of DateTimeInterface.


For Symfony 5, I recommand using the KnpTimeBundle

it provides the twig function |ago

To install : composer require knplabs/knp-time-bundle