I've got an entity with a starting date and an ending date.
Is it possible to get the difference in time between them by using twig?
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
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
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.