datetime属性必须严格符合iso 8601格式,如“2026-08-11t11:24:00+08:00”,年月日需补零、t不可省略、时区偏移须为±hh:mm或z、含时间时秒不可省略;javascript应使用toisostring()生成,服务端需用对应语言的iso格式化方法;非绝对时间点不应滥用time标签。

datetime属性必须是严格ISO 8601字符串,错一个字符就失效
不是“看起来像日期就行”,而是浏览器和爬虫只认字面量级合规格式。写成 "2026/08/11"、"2026-8-11"、"2026-08-11 11:24" 或 "2026年8月11日",都会让 document.querySelector('time').dateTime 返回空字符串——它根本没被解析,连 warning 都不报。
- 年月日必须补零:
"2026-08-11"✅,"2026-8-11"❌ - T 是固定分隔符,不可省略、不可替换:
"2026-08-11T11:24:00+08:00"✅,"2026-08-11 11:24:00"❌ - 时区偏移必须用
±HH:MM或Z:"+08:00"✅,"+8"、"GMT+8"、"CST"❌ - 秒不是可选的(当含时间时):
"2026-08-11T11:24:00+08:00"✅,"2026-08-11T11:24+08:00"❌(HTML 规范要求完整时间含秒)
JavaScript生成datetime值该用toISOString(),别碰toLocaleString()
前端动态插入时间时,new Date().toISOString() 是唯一能直接塞进 datetime 的原生方法。它返回类似 "2026-08-11T03:24:00.123Z" 的字符串,截掉毫秒后就是标准 UTC 格式。
-
toUTCString()返回"Tue, 11 Aug 2026 03:24:00 GMT"→ 非 ISO,❌ -
toString()或toLocaleString("zh-CN")返回本地化字符串 → 含中文、斜杠、空格,❌ - 手拼
date.getFullYear() + "-" + (date.getMonth()+1)→ 漏补零、月份错位、无时区,❌ - 要本地时区带偏移?别手动加
"+08:00";用Intl.DateTimeFormat('sv-SE', { timeZone: 'Asia/Shanghai', hour12: false }).formatToParts()或date-fns/formatISO(date, { format: 'extended' })
服务端渲染时别直接吐数据库DATETIME字段
MySQL 的 "2026-08-11 11:24:00"、PostgreSQL 的 timestamp without time zone 或 Django 模板里直接用 {{ obj.updated_at|date:"Y-m-d H:i:s" }},都缺 T 和时区,会被忽略。
- Python:用
dt.isoformat()(若 dt 是 timezone-aware,则自动带偏移) - Django:用
{{ obj.updated_at|date:"c" }},输出标准 ISO 字符串 - Node.js:用
new Date().toISOString(),再根据需要转成本地偏移(注意:Z ≠ +08:00) - PHP:避免
date('Y-m-d H:i:s'),改用$dt->format('c')(c格式即 ISO 8601)
什么情况下不该用time标签
time 不是“所有带时间字样的内容都该套一层”的装饰标签。它只适用于机器能验证的绝对时间点或明确时长。
- 营业时间:
"9:00–18:00"没绑定具体日期 → 用span+aria-label更合适 - 相对时间:
"刚刚"、"2小时后"、"下周二"→ datetime 无法表达模糊值,硬填会污染语义 - 年份范围:
"2020–2024"→ 必须拆成两个time分别标起止,或放弃语义化 - 仅显示文本没写
datetime属性 → 等同于没写,对 SEO 和辅助技术完全无效
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











