You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在TWIG中将评论日期替换为‘today’或‘yesterday’?

实现TWIG模板中评论日期显示为Today/Yesterday的方案

Hey there! 我来帮你搞定这个日期显示的需求~ 其实TWIG本身就有足够的工具来实现这个,下面给你两种实用的方案,你可以根据自己的场景选:

方案一:直接在模板内做条件判断(快速实现,适合单场景)

这种方法不用改后端代码,直接在TWIG模板里写逻辑就行,非常适合只在评论区这一处用的情况:

<p class="comment__date">
    {% set commentDate = comment.createdAt|date('Y-m-d') %}
    {% set today = 'now'|date('Y-m-d') %}
    {% set yesterday = '-1 day'|date('Y-m-d') %}
    
    {% if commentDate == today %}
        Today
    {% elseif commentDate == yesterday %}
        Yesterday
    {% else %}
        {{ comment.createdAt|date('H:i d/m/Y') }}
    {% endif %}
</p>

逻辑说明:

  • 先把评论日期、今天、昨天都统一转成Y-m-d格式(只保留年月日),这样就不会被时分秒干扰判断
  • 对比后如果是今天就显示Today,昨天显示Yesterday,其他情况还是用你原来的完整日期格式

⚠️ 小提醒:如果你的服务器时区和用户所在时区不一致,记得在date过滤器里指定时区,比如comment.createdAt|date('Y-m-d', 'Asia/Shanghai'),替换成你需要的时区就行。

方案二:自定义TWIG过滤器(代码复用,适合多场景)

如果你的网站有多个地方都需要这种“人性化日期”的显示,那把逻辑封装成TWIG过滤器会更干净,以后用起来也更方便:

第一步:在PHP里写过滤器逻辑

(以Symfony为例,其他TWIG环境写法类似)创建一个Twig扩展类:

use Twig\Extension\AbstractExtension;
use Twig\TwigFilter;

class HumanizeDateExtension extends AbstractExtension
{
    public function getFilters(): array
    {
        return [
            new TwigFilter('humanize_date', [$this, 'convertToHumanDate']),
        ];
    }

    public function convertToHumanDate(\DateTimeInterface $date): string
    {
        $today = new \DateTime();
        $yesterday = (new \DateTime())->modify('-1 day');
        
        // 统一格式对比日期部分
        if ($date->format('Y-m-d') === $today->format('Y-m-d')) {
            return 'Today';
        } elseif ($date->format('Y-m-d') === $yesterday->format('Y-m-d')) {
            return 'Yesterday';
        }
        
        // 其他情况返回原格式
        return $date->format('H:i d/m/Y');
    }
}

然后把这个扩展注册到你的TWIG环境里(Symfony的话可以在services.yaml里配置自动注册,或者手动添加)。

第二步:在模板里直接使用

现在你只需要一行代码就能搞定:

<p class="comment__date">{{ comment.createdAt|humanize_date }}</p>

额外优化:

如果你的comment.createdAt是字符串而不是DateTime对象,可以在过滤器里先转成DateTime,或者在模板里用date_modify('')先处理:

{{ comment.createdAt|date_modify('')|humanize_date }}

这样不管是字符串还是DateTime对象都能正常工作啦~

内容的提问来源于stack exchange,提问作者ArcanumLibella

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:01:36