原生 date/time 输入控件需严格遵循 YYYY-MM-DD 和 HH:MM 格式,iOS 16.4 前及部分 Android WebView 中 min/max 失效、change 事件不可靠,须用 input+blur 双监听并手动校验,空值为 "" 而非 null。

原生 type="date" 和 type="time" 能用,但必须严格按格式写、不能只靠属性就以为万事大吉——尤其在 iOS 16.4 之前和部分 Android WebView 中,min/max 不拦键盘输入,change 事件还可能不触发。
value 必须是 YYYY-MM-DD 或 HH:MM 格式字符串
浏览器只接受标准格式,其他写法会静默失败(输入框变空,也不报错):
-
type="date"的value只能是"2026-06-08",不能是"2026/06/08"、"2026年6月8日"或带时间的"2026-06-08T03:00:00Z" -
type="time"的value只能是"14:30"或"14:30:45",不能是"2:30 PM"或"14时30分" - JS 动态赋值时,别直接塞
new Date()对象,要用el.value = new Date().toISOString().split('T')[0](日期)或el.value = new Date().toTimeString().slice(0, 5)(时间)
min/max 在 Safari 和旧 Android 上形同虚设
这些属性在 Chrome/Edge 中能禁用日历面板里的超限日期,但在 iOS Safari(16.4 之前)和多数厂商定制 Android WebView 中:
-
min="2026-06-01"只影响日历滚动范围,用户仍可键盘输入"2025-12-25"并提交 -
input.checkValidity()和reportValidity()不会因键盘超限而返回false - 必须手动监听
input事件,每次取el.value做格式 + 范围校验,并调用el.setCustomValidity("日期不能早于今天")
事件监听别只靠 change
change 在以下情况可能不触发:
文章转信息图。将文章/笔记转化为手机可读的 HTML 信息图,自动匹配视觉风格。触发场景:文章转图、笔记转图、信息图、转小红书图、做张图、可视化这篇文章、文生图。
立即学习“前端免费学习笔记(深入)”;
- 用户用键盘修改日期后直接失焦(尤其 Android 厂商浏览器)
- 点击日历选中某天,但浏览器未主动触发(Safari 某些版本)
- JS 批量设置多个日期控件时,事件顺序不可靠
稳妥做法是:input 事件做实时校验 + blur 事件兜底确认。例如:
el.addEventListener('input', () => {
if (el.value && new Date(el.value) > new Date('2026-06-08')) {
el.setCustomValidity('不能选择未来日期');
} else {
el.setCustomValidity('');
}
});
el.addEventListener('blur', () => el.reportValidity());
移动端唤起系统控件没问题,但别指望 datetime-local
type="date" 和 type="time" 在 iOS/Android 系统级支持稳定,点开就是原生日历或滚轮时间选择器;但 type="datetime-local":
- iOS Safari 对其
min/max支持极差,甚至不显示时间部分 - Android WebView 中常退化为文本框,且格式混乱(如显示
"2026-06-08T03:00"但无法编辑时间) - 若需同时选日期+时间,建议拆成两个独立控件:
type="date"+type="time",后端拼接处理
真正容易被忽略的是:用户没选时,input.value 是空字符串 "",不是 null 或 undefined——所有校验逻辑里写 !el.value,别用 el.value == null。


















