Twig模板中如何比较日期并实现条件性内容隐藏
失效原因拆解
- 第一处问题是变量引用错位:模板层写的
VALUE根本不是可访问的模板变量,只是前端渲染出来的文本标签。Twig在编译阶段拿到的只有循环上下文里的原始数据,也就是value.sec这个Unix时间戳字段,根本没有VALUE这个变量,判断自然不会生效。 - 第二处问题是比较逻辑错误:如果拿格式化后的
d/m/Y格式字符串比大小,会因为字符串逐位匹配的规则出现逻辑偏差——比如02/01/2023(2023年1月2日)的字符串值远小于19/05/2021,但实际日期要比2021年5月19日晚整整两年,比较结果完全不符合日期先后的判断逻辑。 - 第三处问题是判断条件和需求不匹配:需求是判断日期是否大于19/05/2021,不满足就隐藏,但此前写的判断是“等于指定日期才执行输出逻辑”,哪怕变量引用正确,这个判断条件也和实际需求完全不符。
可直接复用的正确实现
先在循环外定义好对比的基准时间戳,循环内先判断时间戳大小,满足条件再输出内容,不满足就跳过整个块:
{# 提前定义对比基准:2021-05-19 0点对应的Unix时间戳 #} {% set cutoff_timestamp = '2021-05-19'|date('U') %} {% for id, value in item.attributes %} {% set attribute_details = getAttributeSet(id) %} {# 仅当当前属性的日期晚于基准时间时,才输出对应内容 #} {% if value.sec > cutoff_timestamp %} ID: {{ id }}<br> VALUE: {{ value.sec|date("d/m/Y") }}<br> TYPE: {{ data }}<br> LABEL: {{ attribute_details.label }}<br> {% endif %} {% endfor %}
实现说明
- 直接使用原始的Unix时间戳做数值比较,不会因为日期格式转换产生判断误差,比字符串对比可靠得多
- 后续需要调整对比的基准日期时,只需要修改
cutoff_timestamp定义里的日期字符串即可,不需要改动判断逻辑 - 因为判断是在模板层渲染前执行的,不满足条件的内容不会进入输出流,完全实现隐藏不展示的效果
内容的提问来源于stack exchange,提问作者Devkrea
相关产品推荐
相关产品推荐

