web-dev-qa-db-fra.com

Twig différence de date

J'ai une entité avec une date de début et une date de fin.

Est-il possible d'obtenir la différence de temps entre eux en utilisant une brindille?

25
Stefan Braspenning

Depuis PHP 5.3 Il existe une autre option sans écrire une extension.

Cet exemple montre comment calculer le pluriel jour/jours

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

Explication:

PHP 5.3 DateTime objet a une méthode diff() qui retourne un objet DateInterval avec la différence de résultat entre endDate et beginDate Twig

Twig date la fonction retourne toujours un objet DateTime afin que nous puissions appeler la méthode diff

Enfin, nous pouvons accéder aux propriétés de l'objet DateInterval ou le formater avec le filtre Twig date.

Remarque: Il n'est pas nécessaire d'envelopper endDate ou startDate avec la fonction date si la variable est déjà un objet DateTime.

Note2: DateTime est utilisé ici comme synonyme de DateTimeInterface.

75
Maks3w

Il n'y a pas de fonction intégrée pour le faire, mais vous pouvez facilement le faire vous-même, extension de la brindille est facile!

La manière rapide et simple est de le faire avec la classe de fonction simple de twig:

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

La manière réutilisable est de créer une extension twig (documentée sur le même lien). C'est toujours facile.

13
Maerlyn

Notez également qu'il existe un Extension de date de Sensio Labs qui propose un filtre time_diff.

Ensuite, vous pouvez l'utiliser comme ceci: {{ entity.ending_date|time_diff(entity.starting_date) }}

3
Vincent Pazeller