11

如果与该行关联的日期小于 30 天,我正在使用 twig 标记表中的一行。

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 天,我只想标记该行。

4

3 回答 3

28

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

{% if d.LastDate|date("U") > "-30 days"|date("U") %}
    <p>Less than 30 days old</p>
{% endif %}
于 2013-11-04T16:17:26.530 回答
18

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

于 2014-02-14T08:12:27.263 回答
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.3DateTime对象具有diff()返回对象的方法,其结果与 TwigDateInterval之间的差异endDatebeginDate

Twigdate函数总是返回一个DateTime对象,所以我们可以调用diff方法

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

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

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

于 2014-11-29T17:48:31.283 回答