如何在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
相关产品推荐
相关产品推荐

