PHP结合Twig比较活动日期与当日的代码问题排查
问题原因
你的代码存在3个核心问题,导致日期判断逻辑失效:
todays_date()函数没有返回值:函数内只赋值了$date_now = time(),没有用return返回结果,Twig调用该函数时拿不到有效的当前时间值。- 日期比较逻辑错误:你在Twig中先把时间戳格式化为
M d格式的字符串(类似Jan 05、Dec 12)再做大小比较,字符串是按逐字符ASCII码顺序对比,完全不符合日期先后的判断规则,跨月、跨年场景下会直接返回错误的比较结果。 - 时间比较精度问题:直接用
time()取当前带时分秒的时间戳,和不带时分秒的活动开始时间比较时,会出现当天的活动因为当前时间已过当天0点,被误判为已过期的问题。
修正方案
1. 修正PHP函数代码
// 移除无用的$date参数,返回当日0点的Unix时间戳,和活动日期精度对齐 function todays_date() { return strtotime(date('Y-m-d')); } function event_start_date($id) { $startDate = strtotime(get_field('event_start_date', $id)); // 统一转为活动当日0点时间戳,避免时分秒影响比较结果,去掉冗余的date('U')转换 return strtotime(date('Y-m-d', $startDate)); }
2. 修正Twig模板逻辑
比较阶段必须使用原始Unix时间戳做大小判断,确认需要展示时再格式化日期字符串:
{# 先获取原始时间戳,不提前格式化 #} {% set event_ts = function('event_start_date', item.id) %} {% set today_ts = function('todays_date') %} {% if event_ts < today_ts %} <p>无活动</p> {% else %} {# 输出阶段再格式化日期为需要的格式 #} <p class="date">{{ event_ts|date('M d') }}</p> {% endif %}
内容的提问来源于stack exchange,提问作者Sarah
相关产品推荐
相关产品推荐

