Schema 时间字段要求 ISO 8601 格式且必须带时区偏移(如 2026-05-26T08:21:00+08:00),禁止使用纯时间戳、无时区日期或模糊字符串,须通过 DateTime 显式时区转换并校验。

time() 返回的是纯 UTC 秒数,不带时区、不带精度、不带语义——直接塞进 Schema 的 datePublished 或 dateModified 字段,Google 会解析失败或降权。
必须在 PHP 层完成标准化:统一时区 + 显式格式 + 合法边界校验,否则 Structured Data Testing Tool 会报 "datePublished" is not a valid date 这类错误。
Schema 时间字段要求什么格式?
Google 要求 datePublished、dateModified 等字段使用 ISO 8601 格式,且推荐带时区偏移(如 2026-05-26T08:21:00+08:00),不能是纯时间戳或模糊字符串。
- ✅ 正确:
date('c', $ts)(输出含时区的 ISO 8601,如2026-05-26T08:21:00+08:00) - ❌ 错误:
(string)$ts(1748247660不被识别为日期) - ❌ 错误:
date('Y-m-d', $ts)(缺时间、缺时区,Google 可能默认为 UTC,导致显示偏差) - ⚠️ 风险:
date('c')直接用time(),但没设时区——date_default_timezone_get()返回空或UTC时,date('c')会输出+00:00,而你网站实际面向中文用户,这会造成发布时间“早了8小时”
为什么 strtotime() 解析用户输入的时间不能直接喂给 Schema?
用户可能提交 "昨天"、"5分钟前" 或 "2026/05/26" 这类非标准字符串,strtotime() 能解析,但结果不可控:
-
strtotime("05/06/2026")在服务器时区为America/New_York时解析为 5月6日,在Asia/Shanghai下仍按 m/d/Y 解,不是你想要的 6月5日 -
strtotime("next Monday")依赖当前系统时间,若 cron 每天凌晨执行,可能跨周导致datePublished倒退 -
strtotime("")或strtotime(null)返回false,不判空直接传给date('c', ...)会触发警告并输出1970-01-01T00:00:00+00:00—— Google 会认为这是无效发布时间
正确做法是:强制走 DateTime::createFromFormat(),显式约定输入格式,并用 getErrors() 检查解析结果。
如何安全生成符合 Schema 的发布时间?
关键不是“怎么转”,而是“谁来定基准时间”和“是否可复现”。SEO 时间必须与页面真实发布逻辑对齐,不能每次渲染都调用 time()。
立即学习“PHP免费学习笔记(深入)”;
- 数据库里存的是
DATETIME字段(如2026-05-26 08:21:00),PHP 读出后先转为 UTC 时间戳,再格式化:$dt = new DateTime($row['published_at'], new DateTimeZone('Asia/Shanghai'));<br>$dt->setTimezone(new DateTimeZone('UTC'));<br>echo $dt->format(DateTimeInterface::RFC3339); // 2026-05-26T00:21:00+00:00 - 如果内容无明确发布时间(如静态页),用文件修改时间而非当前时间:
$ts = filemtime(__FILE__),避免每次访问都变 - 禁止在模板中写
date('c', time())渲染datePublished—— 这会让 Google 认为页面每秒都在“重新发布” - 对
dateModified,应取数据库中updated_at字段;若无该字段,宁可不填,也不要 fallback 到time()
时区设置错一个字符,Schema 就失效
很多人写 date_default_timezone_set('GMT+8') 或 'PRC',这两种写法都非法,DateTime 构造时会静默失败,format('c') 输出仍是 +00:00。
- ✅ 正确时区标识符只有官方列表里的,如
Asia/Shanghai、America/Los_Angeles - ❌
'GMT+8'不是有效时区名,new DateTimeZone('GMT+8')抛DateInvalidTimeZoneException - ❌
'CST'是歧义缩写(可能是 China Standard Time,也可能是 Central Standard Time),PHP 不识别 - 调试技巧:用
var_dump(DateTimeZone::listIdentifiers())查可用值,或固定用date_default_timezone_set('UTC'),所有时间以 UTC 存储和传输,前端/模板层再转本地显示
time() 替代业务时间,Schema 就从“结构化数据”退化成“随机噪声”。



















