原生 type="month" 输入框仅支持 "yyyy-mm" 格式字符串,不返回 date 对象;value 必须严格匹配该格式(如 "2024-03"),否则清空或校验失败;js 赋值需用 year + "-" + string(month).padstart(2, "0");后端需适配解析,sql 查询须转为日期范围。

原生 type="month 只能选年月,不带日,且 value 永远是 "YYYY-MM" 字符串——别指望它返回 Date 对象、别想手动输“2024/03”、也别在 Safari 旧版本里默认启用。
value 必须是 "YYYY-MM",否则控件变空
浏览器对格式极其敏感:哪怕传 "2024-3"(月份没补零)、"2024/03" 或 "2024年03月",input.value 都会清空或回退到未选状态,checkValidity() 返回 false。
- JS 动态赋值时用:
year + "-" + String(month).padStart(2, "0"),别用toISOString().slice(0,7)(受本地时区影响) - 后端返回非标准格式?前端必须先转换再塞进
value,例如:response.month.replace(/\D/g, "-").replace(/^-+|-+$/g, "").replace(/-{2,}/g, "-")再校验长度是否为 7 - 空字符串
""是合法初始值,但用户未选时提交就是空,后端得判空,不能直接 parse
min/max 要写全 "YYYY-MM",单写 "03" 没用
min="2025-01" 有效,min="01" 或 min="2025" 直接被忽略。部分浏览器(如旧版 Edge)遇到非法 min/max 会静默失效,不报错也不限制。
- 范围边界需显式覆盖完整周期:想限制“2025 年全年”,得设
min="2025-01"和max="2025-12" - 动态设置时注意时区:若用
new Date(2025, 0, 1).toISOString().slice(0,7),UTC+8 时区下可能生成"2024-12"(因构造时本地时间已跨年) - 用户选了超出范围的值?控件可能显示为空,也可能保留但提交失败——不能只靠前端验证,后端仍要校验
服务端收不到 Date,只收到字符串
表单提交或 FormData.get("month") 拿到的永远是 "2026-05",不是 Date、不是数字、更不是 MySQL 的 MONTH() 函数结果。直接拿它去查数据库必错。
- Java Spring Boot 需加
@DateTimeFormat(pattern = "yyyy-MM"),否则抛DateTimeParseException - PHP 接收后用
DateTime::createFromFormat("Y-m", $_POST['month'])构造,再取$date->format("Y-m-01")和$date->format("Y-m-t")得当月起止 - SQL 查询别写
WHERE MONTH(created_at) = '2026-05'——类型错配;正确做法是:WHERE created_at BETWEEN '2026-05-01' AND '2026-05-31'或YEAR(created_at) = 2026 AND MONTH(created_at) = 5
Safari 和部分 WebView 会 fallback 成文本框
iOS 15.4 之前完全不支持 type="month",iOS 16.4 / macOS 13.3 才稳定;安卓某些 WebView(尤其三星)点击后弹出软键盘而非月历。检测不可少,降级方案不能等上线再补。
- 检测写法:
const el = document.createElement("input"); el.type = "month"; if (el.type !== "month") { /* 启用双 select 或 flatpickr */ } - 别依赖
placeholder——Safari 不显示,写了也白写 - 移动端慎用
flatpickr默认配置:必须设disableMobile: true,否则 Android 下可能 fallback 到原生控件,行为割裂 - 双
<select></select>方案中,年份和月份value必须用字符串("2026"和"05"),避免数字5被当成"5"导致拼接成"2026-5"
最常被跳过的环节是服务端对 "YYYY-MM" 的解析逻辑——它不像完整日期那样有通用解析器,每个框架都要单独适配,而且一旦漏配,错误往往静默出现在生产环境查询结果为空时。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











