time标签的datetime属性仅接受严格ISO 8601格式字符串,如“2026-08-11T10:30:00+08:00”,非标准写法(如“2024年5月20日”)会被忽略;显示文本需手动编写,与datetime解耦但语义必须一致;动态生成应优先使用toISOString(),服务端渲染更可靠。

time 标签的 datetime 属性不负责格式化,只负责提供机器可读的标准时间字符串;你看到的“格式化效果”必须手动写在标签内容里,否则浏览器就照搬你写的 ISO 字符串。
datetime 属性必须是 ISO 8601 字面量字符串,不是 JS 时间对象或本地化文本
- 浏览器不会解析
datetime="2024年5月20日"或datetime="2024/05/20"—— 这些值会被忽略,document.querySelector('time').dateTime返回空字符串 - 合法值只能是严格符合 ISO 8601 的字符串,例如:
- 纯日期:
"2026-08-11" - 带时间(UTC):
"2026-08-11T10:30:00Z" - 带时间(本地时区):
"2026-08-11T10:30:00+08:00"
- 纯日期:
- 错一个字符就失效:月份没补零(
"2026-8-11")、T 前后有空格("2026-08-11 T10:30")、时区写成"GMT+8"或"+8:00",全都不认
动态生成 datetime 时,优先用 toISOString(),别拼字符串
- ✅ 安全:
new Date().toISOString()→"2026-08-11T10:30:45.123Z",截掉毫秒即可:.slice(0, 19) + 'Z' - ❌ 危险:
date.getFullYear() + '-' + (date.getMonth()+1)—— 月份不补零、没处理时区、夏令时翻车 - ❌ 更危险:
date.toLocaleString()或date.toString()—— 输出非 ISO 格式,比如"Mon Aug 11 2026 18:48:00 GMT+0800",完全不能塞进datetime
显示文本和 datetime 必须解耦,但逻辑不能冲突
- 用户看到的可以是
"刚刚"、"8月11日 18:48"、"今天下午6点",这没问题 - 但
datetime值必须对应那个“绝对时间点”,且不能自相矛盾:- 允许:
<time datetime="2026-08-11T18:48:00+08:00">刚刚</time>(页面实时渲染) - 禁止:
<time datetime="2026-08-11T18:48:00+08:00">昨天下午6点</time>(语义错乱,屏幕阅读器会困惑)
- 允许:
服务端渲染比前端 JS 注入更可靠
- Google Rich Results Test 等工具只解析 HTML 初始源码,
el.setAttribute('datetime', ...)这种 JS 动态赋值在结构化数据检测中直接被忽略 - 如果时间来自后端(如 CMS、API),应在模板中直接输出合法字符串:
- Python:
{{ dt.isoformat() }}(默认带时区) - Django:
{{ obj.updated_at|date:"c" }} - Node.js:
date.toISOString()(注意 UTC 与本地偏移的取舍)
- Python:
真正容易被忽略的是:你写的 datetime 值是否被浏览器实际识别。打开 DevTools → 选中 time 元素 → 看 DOM 面板里 datetime 属性是否存在、值是否为标准格式;再跑一次 Google Rich Results Test,看 dateModified 或 datePublished 是否被提取出来 —— 不是“写了就算”,而是“写对了才算”。



















