input type="date" 默认值必须为严格 YYYY-MM-DD 格式,斜杠、缺零、含时间或中文均无效;JS 设置需手动拼接日期并确保 DOM 就绪;reset() 仅恢复 HTML 初始 value;旧版 Safari 需 fallback 检测;清空后提交值为空字符串。

input type="date" 的默认值必须是严格 YYYY-MM-DD 格式字符串,其他写法(如带斜杠、缺零、含时间)都会被浏览器忽略,输入框显示为空。
value 属性必须用连字符+补零格式
HTML 中直接设置默认日期,只认 value="2026-10-20" 这一种写法:
-
value="2026/10/20"❌ 斜杠分隔无效 -
value="2026-10-2"❌ 日期没补零(应为02) -
value="2026-10-20T00:00"❌ 多了时间部分 -
value="2026年10月20日"❌ 中文字符完全不识别
服务端渲染时,直接输出已格式化的字符串最稳妥;模板变量要提前转义,避免引号或尖括号破坏 HTML 结构。
JS 动态设 today 默认值要手动拼接
用 new Date().toISOString().slice(0, 10) 看似方便,但它返回的是 UTC 零点对应的本地日期——东八区用户可能看到的是前一天。更可靠的是手动拼接:
立即学习“前端免费学习笔记(深入)”;
const d = new Date();
const today = `${d.getFullYear()}-${String(d.getMonth() + 1).padStart(2, '0')}-${String(d.getDate()).padStart(2, '0')}`;
document.getElementById('date-input').value = today;
注意:赋值前确保 DOM 已就绪,否则 value 写入无效;别用 setAttribute('value', ...),它只改 HTML 属性,不更新控件当前值。
表单 reset() 不会恢复 JS 设置的值
调用 form.reset() 或点击重置按钮时,浏览器只把字段恢复到「初始 HTML 中的 value 值」,不是你 JS 后续设的值。这意味着:
- 如果 HTML 里没写
value,reset 后就是空字符串 - 如果 HTML 里写了
value="2026-01-01",但 JS 改成了"2026-10-20",reset 仍会回到"2026-01-01" - 想让 reset 跟随 JS 修改,得在初始化时同步写
el.setAttribute('value', newValue),或用dataset.initial自行管理初始状态
兼容性差的旧版 Safari 需要 fallback
旧版 Safari(≤13.1)根本不识别 type="date",会退化成普通文本框,且 value="2026-10-20" 渲染为空。检测方式:
const el = document.querySelector('input[type="date"]');
if (!el.value) {
el.value = '2026-10-20';
}
这个判断必须在元素已挂载到文档后执行;否则某些环境里 el.value 永远读出来是空字符串。真正容易被忽略的是:用户点了清空按钮(×)后,提交时该字段是空字符串,不是 null 或 undefined,后端得按空字符串处理。



















