в Twig как сравнить, если дата находится в течение X дней?

Я использую веточку, чтобы отметить строку в таблице, если дата, связанная с этой строкой, меньше 30 дней.

в документации Twig указано, что для сравнения двух объектов даты сначала необходимо преобразовать объект в дату, а затем выполнить сравнение следующим образом:

{% if date(yourDate) < date(-'30days') %} ... {% endif %}

однако он не указывает, как передать формат даты для левой стороны сравнения, я понимаю, что функция даты Twig является своего рода оболочкой для даты PHP.

в PHP я бы обычно называл:

$myDate = DateTime::createFromFormat("m/d/Y", $myDate);

но в Twig, по-видимому, нет способа указать формат исходной даты, чтобы преобразовать его в другой формат, или, по крайней мере, его нет в документации.

вот что я пробовал:

{% if date(d.LastDate) > date('-30days') %}...{% endif %}

{% if d.LastDate | format("Y-m-d") > date('-30days') %}...{% endif %}

{% if date("m/d/Y", d.LastEmailSentDate) > date('-30days') %}...{% endif %}

эти условия и их изменения возвращает следующее исключение В Symfony2:

 An exception has been thrown during the rendering of a template 
("DateTimeZone::__construct(): Unknown or bad timezone (---)")

мой контроллер возвращает дату в формате: m/d/Y и я просто хочу отметить эту строку, если этой дате меньше 30 дней.

3 ответов


сравните две даты, получив количество секунд с эпохи Unix (формат даты PHP U)

{% if d.LastDate|date("U") > "-30 days"|date("U") %}
    <p>Less than 30 days old</p>
{% endif %}

Twig 1.6 поддерживает сравнение дат.

{% if date(d.LastDate) > date("-30 days") %}
    <p>Less than 30 days old</p>
{% endif %}

{% if date(d.LastDate) > date("now") %}
    <p>Future date</p>
{% endif %}

http://twig.sensiolabs.org/doc/functions/date.html


С PHP 5.3 есть способ с большей точностью.

{# endDate and startDate are strings or DateTime objects #}
{% set difference = date(endDate).diff(date(startDate)) %}
{% set leftDays = difference.days %}
{% if leftDays > 30 %}
  Less than 30 days old
{% else %}
  More than 30 days old
{% endif %}

объяснение:

PHP 5.3 и diff() метод, который возвращает DateInterval объект с разницей результатов между endDate и beginDate Прутик!--13-->

веточка date функция всегда возвращает DateTime объект, поэтому мы можем назвать diff метод

наконец, мы можем получить доступ к свойствам DateInterval объект или отформатировать его с помощью фильтра даты Twig.

Примечание: нет необходимости переносить endDate или startDate с функцией date, если переменная уже является объектом DateTime.

примечание 2: DateTime используется здесь как синоним DateTimeInterface.