Twig日期差异

38

我有一个具有开始日期和结束日期的实体。

使用twig能否获得它们之间的时间差异?

4个回答

99

自 PHP 5.3 开始,有一种不需要编写扩展程序的选项。

这个示例展示了如何计算复数的日/天数。

{# endDate and startDate are strings or DateTime objects #}
{% set difference = date(endDate).diff(date(startDate)) %}
{% set leftDays = difference.days %}
{% if leftDays == 1 %}
  1 day
{% else %}
  {{ leftDays }} days
{% endif %}

说明:

PHP 5.3 DateTime 对象有一个 diff() 方法,它返回一个 DateInterval 对象,表示 endDatebeginDate 之间的时间差。

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

最后,我们可以访问 DateInterval 对象的属性或使用 Twig 的 date 过滤器格式化它。

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

注意2:这里将 DateTime 用作 DateTimeInterface 的同义词。


4
这确实像梦想一样有效,但如果日期之间的差距将超过一个月,请使用.days而不是.d,.d只返回天数部分,即如果差距为1个月1天,则.d将为1,但.days将为32(假设为31天的月份)。 {% 设leftDays = difference.days %} - Steve Childs
2
获取出生日期 {{ date().diff(date(item.birth)).y }} - dikirill
5
起始日期和结束日期的位置不同,但结果都是一天。如何确定是剩余一天(+1),还是超过一天(-1)? - Pathros
1
太棒了,伙计。你是一位Twig大师。 - Macbernie
@Pathros,我们在同一条船上,你有没有想出解决方案? - Tim Bogdanov
difference.invert 告诉你它是否为负数。 - Maks3w

13

没有内置的函数可以做到这一点,但您可以轻松地自己实现。 扩展twig 很容易!

快捷简单的方法是使用twig的简单函数类来完成:

$function = new Twig_SimpleFunction('date_difference', function ($start, $end) {
    // ... calculate difference and return it
});

// assuming $twig is an instance of Twig_Environment
$twig->addFunction($function);

可重复使用的方法是创建一个Twig扩展(在同一个链接中有文档记录)。这仍然很容易。


4
请注意,Sensio Labs有一个现有的日期扩展,提供了一个time_diff过滤器。您可以像这样使用它:{{ entity.ending_date|time_diff(entity.starting_date) }}
请注意,此插件已被放弃,并且不支持Twig 3:https://packagist.org/packages/twig/extensions

如果存在标准选项,请避免编写或使用扩展,尽量保持简单。 - undefined

3

对于Symfony 5,我建议使用KnpTimeBundle

它提供了Twig函数|ago

安装方法:composer require knplabs/knp-time-bundle


避免编写或使用扩展,如果存在标准选项,请尽量保持简单。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接