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

