Twig - 前一段时间的格式

Mar*_*k S 10 php twig

我是Twig的新手,我希望像2小时前3天前一样将datetime格式转变为时间.有一个jquery插件(jquery-timeago),我一直在客户端使用,但如果我可以用树枝做这个将是很好的.如果twig没有附带这种过滤器格式,我可以使用扩展吗?

10u*_*0us 20

Twig的日期延长完全符合您的要求:

{{ post.published_at|time_diff }}
Run Code Online (Sandbox Code Playgroud)

上面的示例将输出一个字符串,如4秒前1个月,具体取决于过滤日期.

请参阅http://twig.sensiolabs.org/doc/extensions/date.html(不再有效)工作链接http://twig-extensions.readthedocs.io/en/latest/date.html

要使其工作,请按照下列步骤操作:

composer require twig/extensions
Run Code Online (Sandbox Code Playgroud)

使用symfony时,请将此添加到services.yml中

services:
  twig.extension.date:
    class: Twig_Extensions_Extension_Date
    tags:
    - { name: twig.extension }
Run Code Online (Sandbox Code Playgroud)

  • 不幸的是,如果差异是0秒,那么过滤器会给出undefined(或null?).所以,你必须使用`{{post.published_at | time_diff?:'just now'}}`.我建议按照上面的建议编写自定义过滤器. (2认同)

Mar*_*k S 12

我发现我可以用树枝创建一个自定义过滤器Twig_SimpleFilter.

$filter = new Twig_SimpleFilter('timeago', function ($datetime) {

  $time = time() - strtotime($datetime); 

  $units = array (
    31536000 => 'year',
    2592000 => 'month',
    604800 => 'week',
    86400 => 'day',
    3600 => 'hour',
    60 => 'minute',
    1 => 'second'
  );

  foreach ($units as $unit => $val) {
    if ($time < $unit) continue;
    $numberOfUnits = floor($time / $unit);
    return ($val == 'second')? 'a few seconds ago' : 
           (($numberOfUnits>1) ? $numberOfUnits : 'a')
           .' '.$val.(($numberOfUnits>1) ? 's' : '').' ago';
  }

});
Run Code Online (Sandbox Code Playgroud)

然后我将它添加到我的Twig环境中:

$twig = $app->view()->getEnvironment();//because I'm using Twig in Slim framework
$twig->addFilter($filter);
Run Code Online (Sandbox Code Playgroud)

使用它我的模板如下:

{{2014-10-11 12:54:37|timeago}}
Run Code Online (Sandbox Code Playgroud)


nur*_*abe 5

如果您在Symfony中使用Twig,请查看KnpTimeBundle.包括多种语言的"以前"支持.