原生 <input type="date"> 仅接受 ISO 8601 格式(YYYY-MM-DD),非法格式赋值会静默清空;浏览器兼容性差,事件行为不一致;需前后端协同校验格式,否则导致数据错乱。

HTML 原生 <input type="date"> 日历控件本身没有额外校验逻辑,但会强制要求用户选择符合 YYYY-MM-DD 格式的日期,并拒绝非法值(如 2024-02-30 或空字符串)——它不是“自由输入”,而是“约束式选择”。
为什么选了日期却提交不了?value 格式不对就清空
浏览器内置日历只接受标准 ISO 8601 格式(YYYY-MM-DD),哪怕你用 JavaScript 赋值 "2024/02/29" 或 "29-02-2024",它都会静默清空 value,表单提交时变成空字符串。
- 服务端或 JS 获取
input.value时,必须检查是否为空,不能默认有值 - 用 JS 设置日期请统一用
new Date().toISOString().split('T')[0]或date.toISOString().slice(0,10) - 后端接收时别依赖
date类型自动解析——先校验格式再转,否则 MySQL 可能存成0000-00-00
<input type="date"> 在不同浏览器里表现不一致
Chrome / Edge 显示原生下拉日历;Safari 从 16.4+ 才支持;Firefox 一直只显示文本框+小图标(点击无反应);iOS Safari 点击直接唤起系统日期滚轮,但返回后可能不触发 change 事件。
将调研报告、方案对比、数据分析、需求梳理、会议纪要、设计说明、代码评审、学习笔记等任务产物输出为可在浏览器直接打开的单文件 HTML,替代 Markdown 作为最终交付物。Markdown 在信息密度、视觉清晰度和可分享性上已跟不上 AI 产物的丰富度,HTML 能同时承载排版、表格、SVG 等。
- 不要用
:valid伪类做样式判断——Firefox 下永远 invalid,因为没交互能力 - 移动端真机测试必做:iOS 上
input失去焦点后,change有时不触发,建议监听blur+ 校验value变化 - 如果需要统一 UI 或范围限制(如禁选过去日期),得配合
min/max属性,而不是靠 JS 拦截
和第三方日历库(如 Flatpickr、Day.js)根本不是一类东西
原生日历是表单控件,不提供 API、不支持中文 locale、不能自定义周起始、无法高亮节假日;而 JS 日历库是独立渲染的 DOM 组件,要自己绑定数据、处理格式转换、维护状态。
立即学习“前端免费学习笔记(深入)”;
- 若只要基础日期录入且兼容性可妥协(如内部管理系统),用
<input type="date">最轻量 - 若需“选择一个范围”“禁用周末”“显示农历”“中文化界面”,必须上 JS 库——原生控件连“显示今天”按钮都没有
- 混用风险:给原生
input加readonly再套 JS 日历,容易造成双事件、双状态,推荐直接替换为库的 input 容器
真正麻烦的不是怎么选日期,而是怎么让“用户看到的”“JS 读到的”“后端存下的”三者始终对得上——格式链断一环,就出现 2024-02-30 存进数据库或者前端显示“Invalid Date”。


















