как проверить, находится ли сегодня между двумя датами в Twig?

Я хотел бы проверить, находится ли сегодняшняя дата между двумя датами из базы данных. Вот мой код.

{% if today < room.price_start_date and today > room.price_end_date %}
<a href="{{'/'|app}}/book/{{room.id}}"><button type="button" class="btn btn-default btn-xs">Book this room</button></a>
{% else %}
<a href="{{'/'|app}}/contact"><button type="button" class="btn btn-default btn-xs">Book this room</button></a>
{% endif %}

Переменная today получает свое значение из этого кода:

$todayDate = date('Y-m-d');
$this['today'] = date('Y-m-d', strtotime($todayDate));

price_start_date и price_end_date я получаю их из базы данных, а тип их столбцов - Date

Есть идеи, как проверить, находится ли today между room.price_start_date и room.price_end_date в Twig?


person Ahmed Essam    schedule 26.12.2016    source источник


Ответы (4)


Согласно руководству TWIG, вы можете использовать функцию date. Если аргумент не передан, функция возвращает текущую дату.

Таким образом, ваш код может выглядеть так в TWIG:

{% if date(room.price_start_date) < date() and date(room.price_end_date) > date() %}
  {# condition met #}
{% endif %}
person Farside    schedule 26.12.2016
comment
На самом деле я изменил знаки сравнения на `{% if date(room.price_start_date) ‹ date() and date(room.price_end_date) › date() %} ` и сработало. Огромное спасибо ! - person Ahmed Essam; 27.12.2016
comment
@AhmedEssam, спасибо, вы правы, я правильно обновил знаки сравнения. Не стесняйтесь принять ответ и надеюсь, что он поможет кому-то еще! - person Farside; 27.12.2016
comment
Это будет работать только в том случае, если установлены и начало, и конец. Если какой-либо из них открыт или равен нулю, он не будет работать правильно. - person Mbotet; 19.02.2020

Используйте экземпляры \DateTime для сравнения дат в Twig (а также в PHP).

Что случилось?

Функция date('Y-m-d') возвращает отформатированную дату строка.

Итак, вы должны изменить его на $today = new \DateTime('today'); и передать этот экземпляр в шаблон Twig или использовать функцию date() Twig непосредственно в вашем условии.

price_start_date и price_end_date я получаю их из базы данных, а тип их столбцов - Дата.

Предполагая, что эти два (room.price_start_date и room.price_end_date) являются экземплярами \DateTime, ваш код Twig должен работать нормально.

person yceruto    schedule 26.12.2016
comment
Следует отметить, что YYYY-MM-DD строки даты (date('Y-m-d')) правильно сопоставимы в PHP 3v4l.org/bCfZv и twig twigfiddle.com/opjcw8 - person Will B.; 28.09.2018

Попробуйте функцию даты: http://twig.sensiolabs.org/doc/functions/date.html

Возможно, вам придется немного изменить свой код, поэтому я не могу посоветовать лучше.

РЕДАКТИРОВАНИЕ №2

Извините, у меня не было возможности просмотреть документы по функции даты Twig, но хорошо, что это сделали @Yonel и @Farside. Точки @Yonel - это те, которые меня беспокоили, и у меня не было времени дать хороший ответ.

Если вы используете \DateTime, то это будут ваши изменения кода:

{% if date() < date(room.price_start_date) and date() > date(room.price_end_date) %}
    <a href="{{'/'|app}}/book/{{room.id}}">
    <button type="button" class="btn btn-default btn-xs">Book this room</button></a>
{% else %}
    <a href="{{'/'|app}}/contact">
    <button type="button" class="btn btn-default btn-xs">Book this room</button></a>
{% endif %}

Я также улучшил форматирование. Я предполагаю, что вы просто проверяете, может ли пользователь щелкнуть забронировать номер в течение этого периода времени. И ваш код выглядит хорошо.

Вы можете добавить {{ dump(room.price_start_date) }} и т. д. в среду DEV, чтобы отладить то, как выглядят ваши фактические даты, в качестве метода устранения неполадок.

person Alvin Bunk    schedule 26.12.2016

Для решения с открытыми датами рассмотрите возможность немного расширить решение @Farside следующим образом:

    {% if ( date(room.price_start_date) is null or date(room.price_start_date) < date())  and   
          ( date(room.price_end_date)   is null or date(room.price_end_date)   > date()) %}

      {# condition met #}

    {% endif %}

Также примите во внимание, что если ни начало, ни конец не установлены, будет учитываться все, что находится внутри диапазона.

person Mbotet    schedule 19.02.2020