我使用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天,我只想标记该行。
答案 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 %}
答案 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
个对象,结果差异在endDate
和beginDate
之间
Twig
Twig date
函数始终返回DateTime
个对象,因此我们可以调用diff
方法
最后,我们可以访问DateInterval
对象的属性,或使用Twig日期过滤器对其进行格式化。
注意:如果变量已经是DateTime对象,则不需要使用date函数包装endDate或startDate。
注2:DateTime
在此处用作DateTimeInterface
的同义词。