0

我正在构建一个系统,其中显示用户的出生日期,以及该用户在今年 1 月 1 日的年龄。因此,它会将 Joe Bloggs 的出生日期显示为10th October 1987,然后显示该人在当年 1 月 1 日的年龄(25在这种情况下)。

因为用户将连同他们的全名和电子邮件地址一起显示在列表中,所以我希望能够使用 Twig 在此信息中显示他们的年龄。但是,我似乎无法理解如何实现这一目标。

4

3 回答 3

6

我认为您需要添加适当的Twig 过滤器才能将给定的出生日期变成特定的年龄。

查看文档中的Extending Twig部分,您可能会注意到添加新过滤器非常简单。

如何 ...

1 - 添加扩展的自定义树枝扩展类\Twig_Extension

class customExtension extends \Twig_Extension {

2 - 通过覆盖getFilters()方法添加适当的过滤器

   public function getFilters() {
        return array(
            'age' => new \Twig_Filter_Method($this, 'getAge'),
        );
    }

3 - 添加一些逻辑来获取给定出生日期的年龄

public function getAge($date) 
{
    if (!$date instanceof \DateTime) {
        // turn $date into a valid \DateTime object or let return
        return null;
    }

    $referenceDate = date('01-01-Y');
    $referenceDateTimeObject = new \DateTime($referenceDate);

    $diff = $referenceDateTimeObject->diff($date);

    return $diff->y;
}

然后,按如下方式调用您的过滤器,

{{ yourDateOfBirthInstance | age }}
于 2013-09-06T13:56:36.060 回答
4

通过创建树枝扩展 SimpleFilter,您将能够:{{ app.user.birthday|age }}

<?php

// src/You/YourBundle/Twig/AgeExtension.php

namespace You\YourBundle\Twig;

class AgeExtension extends \Twig_Extension
{

    public function getFilters()
    {
        return array(
            new \Twig_SimpleFilter('age', array($this, 'ageCalculate')),
        );
    }

    public function ageCalculate(\DateTime $bithdayDate)
    {
        $now = new \DateTime();
        $interval = $now->diff($bithdayDate);

        return $interval->y;
    }

    public function getName()
    {
        return 'age_extension';
    }
}

注册您的分机

# src/You/YourBundle/Resources/config/services.yml

You\YourBundle\Twig\AgeExtension:
    class: You\YourBundle\Twig\AgeExtension
    tags:
        - { name: twig.extension }

要使用它:

{{ user.birthday|age }}
于 2014-09-02T15:16:56.807 回答
1

使用DateTime类:

$januaryDate = date('01-m-Y');
$sDateBirth = '10th October 1987'; 

$oDateNow = new DateTime($januaryDate);
$oDateBirth = new DateTime($sDateBirth);
$oDateInterval = $oDateNow->diff($oDateBirth);
echo $oDateInterval->y;

输出:

25
于 2013-09-06T14:06:53.227 回答