
在 WordPress 中使用 DateTime::createFromFormat() 创建时间对象时,若未显式传入时区参数,会默认使用服务器本地时区而非 WordPress 设置的时区(如 Europe/Paris),导致生成的时间戳与预期不符。本文详解原因及正确实践方法。
在 wordpress 中使用 `datetime::createfromformat()` 创建时间对象时,若未显式传入时区参数,会默认使用服务器本地时区而非 wordpress 设置的时区(如 europe/paris),导致生成的时间戳与预期不符。本文详解原因及正确实践方法。
当你在 WordPress 环境中调用:
$start = DateTime::createFromFormat('G:i', '21:00');
该方法不会自动继承 wp_timezone() 的时区设置,而是依赖 PHP 默认时区(通常由 date_default_timezone_get() 返回,可能是 UTC 或服务器本地时区)。例如,若服务器时区为 UTC,而你的 WordPress 时区是 Europe/Paris(UTC+2),那么 '21:00' 在 UTC 下解析为 2022-08-24 21:00:00 UTC,对应北京时间(或巴黎时间)就是 2022-08-25 23:00:00 —— 这正是你观察到 $start1 时间戳为 1661374800(即 24/08/2022 23:00:00 CEST)的根本原因。
✅ 正确做法:始终将 wp_timezone() 作为第三个参数传入 createFromFormat(),确保时间解析严格基于站点配置的时区:
$timezone = wp_timezone();
$start = DateTime::createFromFormat('G:i', '21:00', $timezone);
if (!$start) {
throw new InvalidArgumentException('Invalid time format');
}
$timestamp = $start->getTimestamp(); // ✅ 正确:21:00 in Europe/Paris → timestamp for today 21:00 CEST/CET
// 验证结果(输出格式化后的时间,确认时区一致性)
echo $start->format('Y-m-d H:i:s T'); // e.g. "2022-08-24 21:00:00 CEST"
⚠️ 注意事项:
- 不要混用
strtotime()(如strtotime('21:00')),它完全忽略 WordPress 时区,仅按服务器时区或date_default_timezone_set()解析; -
wp_date('U', ..., $timezone)中的$timezone参数仅影响格式化输出,不改变时间戳计算逻辑,因此不能用于修正strtotime()的偏差; - 建议在开发中始终检查并统一时区源:
var_dump(date_default_timezone_get(), wp_timezone()->getName());,避免隐式时区冲突。
? 扩展:若需获取「每天 21:00」的未来/过去时间戳(如定时任务),可结合 modify() 使用:
$base = new DateTime('today 21:00', $timezone);
$base->modify('+1 day'); // 明日21:00
$futureTimestamp = $base->getTimestamp();
遵循此规范,即可稳定、可靠地生成符合 WordPress 时区设定的每日固定时刻时间戳。










