WordPress中自定义格式ACF日期字段无法比较及报错原因查询
报错原因分析
该报错的核心是DateTime::createFromFormat()方法解析日期失败时会返回布尔值false,此时对布尔值调用成员方法format()自然会抛出错误。常见的解析失败原因分为三类:
- ACF字段返回值为空:对应文章未填写
start_date字段,get_field()返回空字符串,无法匹配日期格式 - 格式参数不匹配:你代码中传入的格式
j F, Y和ACF日期字段实际设置的返回格式不完全一致,比如逗号缺失、空格数量不对 - 月份本地化冲突:如果你的WordPress站点设置了非英语的本地化语言,ACF返回的月份会被翻译为对应语言(比如中文站点返回
20 九月, 2021,而createFromFormat()默认仅支持英文月份字符串解析,直接解析就会失败)。
解决方案
1. 优先使用ACF原始存储值解析(最稳妥)
ACF日期字段在数据库中默认存储Ymd格式(例如20210920)的原始值,不受本地化影响,你可以通过第三个参数关闭格式化返回,直接拿到原始值解析:
// 第三个参数设为false,直接获取数据库存储的原始日期值 $start_date_raw = get_field('start_date', false, false); $end_date_raw = get_field('end_date', false, false); $start_date = new DateTime($start_date_raw); $end_date = new DateTime($end_date_raw);
2. 增加容错判断
无论用哪种解析方式,都需要先判断解析是否成功,避免触发报错:
$start_date = DateTime::createFromFormat('j F, Y', get_field('start_date')); $end_date = DateTime::createFromFormat('j F, Y', get_field('end_date')); if ($start_date && $end_date) { // 计算日期差 $diff = $start_date->diff($end_date); // 输出相差天数 echo '相差'.$diff->days.'天'; // 也可以按原格式输出 echo $start_date->format('j F, Y'); } else { // 异常处理逻辑 echo '日期参数无效'; }
3. 排查实际返回值
如果要继续用原返回格式解析,可以先打印字段实际返回内容确认格式是否正确:
var_dump(get_field('start_date'));
内容的提问来源于stack exchange,提问作者Robert Crx
相关产品推荐
相关产品推荐

