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

如何在Smarty中正确比较包含时分的日期时间戳字符串?

问题描述

在Smarty模板中尝试比较两个日期时间字符串,写法如下:

{if $CONFIG.ENDDATE lte $smarty.now|date_format:"%Y%m%d %H:%M"}

其中$CONFIG.ENDDATE和格式化后的$smarty.now均为类似"20231218 16:02"的字符串,但该比较未按预期生效。仅比较日期部分(%Y%m%d)时,一切正常。此前参考的日期比较方案不适用于带时间的场景。

解决方案

直接字符串比较日期时间存在潜在问题:若其中一个字符串的小时/分钟为单数字(如"20231218 9:02"而非"20231218 09:02"),字符顺序比较会出错;且Smarty的字符串比较可能存在隐性类型转换偏差。最可靠的方式是将两个日期转换为Unix时间戳(数值类型)后再比较:

方法1:模板内直接转换比较

利用PHP的strtotime()函数将日期字符串转为时间戳,直接与$smarty.now(本身即为当前时间的Unix时间戳)比较:

{if strtotime($CONFIG.ENDDATE) lte $smarty.now}
    <!-- 满足条件时的内容 -->
{/if}

注:若Smarty安全策略禁用了直接调用PHP函数,需先在后台配置允许strtotime,或采用方法2。

方法2:后台预处理时间戳

在PHP业务代码中,将$CONFIG.ENDDATE转换为时间戳后传递给模板:

// PHP后台代码
$smarty->assign('CONFIG_ENDDATE_TS', strtotime($CONFIG['ENDDATE']));

然后在模板中直接比较数值:

{if $CONFIG_ENDDATE_TS lte $smarty.now}
    <!-- 满足条件时的内容 -->
{/if}

验证格式兼容性

确保$CONFIG.ENDDATE的格式是strtotime可识别的(如示例中的"YYYYMMDD HH:MM"格式完全兼容),若格式特殊,可先通过date_format统一格式后再转时间戳。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 15:32:28