使用Twig和Symfony2计算1月1日用户的年龄

时间:2013-09-06 13:46:26

标签: date symfony twig

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

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

3 个答案:

答案 0 :(得分:6)

我认为您需要添加适当的Twig Filter才能将出生日期转为特定年龄。

查看文档的Extending Twig部分,您可能会注意到adding a new filter非常简单。

如何......

1 - 添加一个扩展\Twig_Extension

的自定义twig扩展类
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 }}

答案 1 :(得分:3)

通过创建一个Twig扩展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.twig.age_extension:
    class: You\YourBundle\Twig\AgeExtension
    tags:
        - { name: twig.extension }

使用它:

{{ user.birthday|age }}

答案 2 :(得分: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