input type="date"仅保证提交值为yyyy-mm-dd字符串,value必须严格符合该格式(如"2026-05-22"),否则静默失败;需用el.value赋值、避免setattribute;min/max在safari/android webview中无效;时区易致日期偏移,后端应直接解析字符串而非转date对象。

input type="date" 能用,但别当它是“开箱即用”的标准控件——它只保证提交值是 YYYY-MM-DD 字符串,其余全是浏览器各自发挥。
value 必须是严格 YYYY-MM-DD,否则静默失败
赋值写成 "2024/05/20"、"2024-5-20" 或带时间的 "2024-05-20T08:00",浏览器会直接清空输入框,不报错也不提示。用户看到的是空白,但 input.value 是空字符串,不是 null。
- 初始化时用
new Date().toISOString().split('T')[0]生成合法值,比如"2026-05-22" - JS 动态设置必须走
el.value = "2026-05-22",不要用setAttribute('value', ...)(只改 HTML 属性,不更新 DOM 值) - 后端返回的 ISO 时间字符串(如
"2026-05-22T14:30:00Z")要先截取再赋值:dateStr.split('T')[0]
min/max 在 Safari 和 Android WebView 中形同虚设
Chrome 里 min="2026-01-01" 真能禁用早于该日期的选择;但在 iOS Safari(尤其 15.x 及更早)和多数 Android WebView 中,用户仍可键盘输入超限日期,且 checkValidity() 不报错。
-
min和max值必须是YYYY-MM-DD格式字符串,不能是Date对象或带时间的 ISO - 动态设置推荐:
el.min = new Date().toISOString().slice(0, 10) - 强校验场景必须配合 JS:
input或change事件中手动判断new Date(input.value) ,再调用 <code>input.setCustomValidity("日期不能早于起始日")
提交值是本地日期,但被当成 UTC 零点发出去
你在北京选了 "2026-05-22",表单提交的实际是 UTC 时间 "2026-05-21T16:00:00Z"。后端若用 new Date(requestBody.date) 解析,可能误判为 5 月 21 日。
- 后端别用构造函数解析,直接按字符串切分:
dateStr.substring(0, 4)取年,或用dayjs(dateStr, 'YYYY-MM-DD')这类严格模式解析器 - 前端如需本地
Date对象,优先用input.valueAsDate(注意 Safari 15.4+ 才稳定支持),而非new Date(input.value) - 若业务对“当天”逻辑敏感(如签到、限时活动),建议后端统一按客户端传来的
YYYY-MM-DD字符串处理,不转Date
form.reset() 行为不一致,别依赖它
Chrome 和 Firefox 中 form.reset() 会让 input[type="date"] 变为空;Safari 却保留初始 value 值。这不是 bug,是各引擎对“默认值”的定义不同。
- 重置逻辑必须用 JS 显式控制:
document.querySelector('input[type="date"]').value = ""或设回某个固定值 - 如果表单有多个 date 字段,逐个赋值比靠
reset()更可靠 - Vue/React 中绑定 v-model 或 value + onChange 时,更要避免混用原生 reset —— 框架状态和 DOM 值容易脱钩
最麻烦的从来不是怎么写,而是你永远不知道用户用的是哪台设备、哪个系统版本、哪个 WebView 容器——input type="date" 的“标准”,只存在于规范文档里。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











