Twig date difference
Asked Answered
R

4

38

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?

Runyan answered 27/3, 2013 at 11:25 Comment(0)
A
100

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.

Areopagite answered 29/11, 2014 at 17:44 Comment(6)
This does work like a dream, however if the difference between the dates is going to be more than a month, use .days instead of .d, .d only returns the days portion, i.e. if the difference is 1 month, 1 day, .d would be 1, but .days would be 32 (assuming a 31 day month). {% set leftDays = difference.days %}Haydon
To get birthdate {{ date().diff(date(item.birth)).y }}Nord
But either position of both start date and end date will result in one day. How do you determine if it is one day left (+1), or one day over (-1)???Rhine
Awesome dude. You're a twig guruColitis
@Rhine in the same boat, did you ever come up with a solution?Isidor
difference.invert tells you if it's negative or not php.net/manual/en/class.dateinterval.phpAreopagite
C
13

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.

Cravat answered 27/3, 2013 at 18:20 Comment(0)
E
4

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

Ennead answered 9/11, 2015 at 15:9 Comment(1)
Avoid write or use an extension if an standard option exist, keep it as simple as possible.Masked
R
3

For Symfony 5, I recommand using the KnpTimeBundle

it provides the twig function |ago

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

Recipience answered 6/5, 2021 at 14:53 Comment(1)
Avoid write or use an extension if an standard option exist, keep it as simple as possible.Masked

© 2022 - 2025 — McMap. All rights reserved.