原生 input[type="time"] 不支持 pattern 等格式校验,仅校验是否可解析为合法时间;需用 javascript + setcustomvalidity() 实现 hh:mm 格式校验,并处理粘贴及清空状态。

原生 input[type="time"] 根本不支持格式校验
它没有 pattern、minlength、maxlength 等可用于时间格式的原生校验属性;浏览器对它的校验仅限于“是否能解析为合法时间值”,且只在表单提交时触发。输入 "25:00" 或 "12:61",Chrome 会自动清空字段(视为空值),Firefox 可能保留但提交时报错——但这不是你可控的格式提示,而是 UA 的兜底行为。
required 只管“有没有输”,不管“输得对不对”
加了 required 后,用户没点选任何时间,input.value 是空字符串 "",会触发必填校验;但一旦用户输入了 "9:5"、"13-30" 或粘贴了 "13:30:45",只要浏览器能从中提取出有效小时和分钟(比如忽略秒、容忍缺前导零),就会认为合法并允许提交。这不是 bug,是规范定义的行为:type="time" 的 value 始终被标准化为 "HH:mm",中间过程完全不可见、不可干预。
想真正校验格式?必须用 JavaScript + setCustomValidity()
原生能力到此为止,真实场景下你需要主动接管:
- 监听
input或change事件,读取input.value - 用正则
/^([01]?[0-9]|2[0-3]):[0-5][0-9]$/判断是否符合 24 小时制 HH:mm 格式(注意:不能只靠valueAsNumber,它对非法值返回NaN,但无法区分"9:5"和"09:05") - 调用
input.setCustomValidity("时间格式错误")触发原生报错样式 - 验证通过时务必调用
input.setCustomValidity("")清空状态,否则后续所有提交都会失败 - 别忘了处理粘贴:
input.addEventListener('paste', e => setTimeout(() => validateTime(input), 0))
最常被忽略的一点:时区与显示格式无关
input[type="time"] 的 value 永远不含时区信息,也不受 lang 或 dir 影响;它只是个“本地时间片段”。你看到的 1:30 PM 或 13:30 完全由用户系统设置决定,JS 里拿到的永远是 "13:30" 这样的字符串。所以所谓“强制 24 小时制校验”,本质是你在 JS 层拒绝一切非 HH:mm 字符串——而不是改变控件外观。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











