$now = current_time( 'timestamp' );
$start = strtotime( get_post_meta( $id, 'start_at', true ) );
if ( $now >= $start ) { /* 展示 */ }

公告设成上午九点上线,实际下午五点才出现,结束时间也跟着晚八小时,服务器 date 命令显示 UTC,WordPress 后台设置的是 Asia/Shanghai。这类现象通常不是突然出现的,往前翻半天日志能看到苗头。

追下去是这么回事:比较用的时间由 strtotime 生成,没带时区,PHP 默认时区是 UTC,和后台设置的上海时间差八小时。数据库里存的是本地时间字符串,直接比大小就整体偏移。

「公告时间区间时区」排查到最后往往是很小的一处差异,前面那些复杂猜测可以先放一放。同一份配置存在多处的,先确认改的是被加载的那一份。

新版本先放一台机器上跑一天再全量,问题一般在这段时间暴露。

处理上按这个顺序:用 current_time( 'timestamp' ) 取站点时间,再和公告时间比较,不要用 time();存库统一转成 GMT 字符串,读取时再按站点时区还原;把公告开始时间设成十分钟后,盯前台到点是否出现。

确认没问题再收工,公告在设定的九点整出现,结束时间也与后台填写的一致。

作者 9823189