在Twig如何比较日期是否在X天内?

时间:2013-11-04 15:19:12

标签: php date symfony twig

我使用twig标记表中的行,如果与该行关联的日期少于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 个答案:

答案 0 :(得分:19)

通过获取自Unix Epoch(PHP日期格式U)以来的秒数来比较两个日期

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

答案 1 :(得分:14)

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

答案 2 :(得分:3)

自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 DateTime对象有diff()方法返回DateInterval个对象,结果差异在endDatebeginDate之间 Twig

Twig date函数始终返回DateTime个对象,因此我们可以调用diff方法

最后,我们可以访问DateInterval对象的属性,或使用Twig日期过滤器对其进行格式化。

注意:如果变量已经是DateTime对象,则不需要使用date函数包装endDate或startDate。

注2:DateTime在此处用作DateTimeInterface的同义词。

相关问题