最简单但兼容性有限,现代浏览器(chrome 20+、edge 12+、firefox 57+、safari 14.1+)支持,渲染为年月选择器,值固定为"yyyy-mm"格式;firefox 56及更早、旧版safari不支持。

用 <input type="month"> 最简单,但兼容性有限
现代浏览器(Chrome 20+、Edge 12+、Firefox 57+、Safari 14.1+)原生支持 <input type="month">,它会渲染为带年份和月份选择器的控件,值格式固定为 "YYYY-MM"(如 "2024-03")。但注意:Firefox 56 及更早版本不支持,旧版 Safari(
常见错误是直接写 <input type="month" value="3">——这会失效,因为 value 必须是完整年月格式;正确写法是 <input type="month" value="2024-03">。若需默认当前月份,得用 JS 动态设置:input.value = new Date().toISOString().slice(0, 7)。
需要兼容老浏览器?用 <select></select> 手动构造年月选项
当目标用户可能使用 IE 或旧版 Safari 时,<select></select> 是最稳妥的选择。关键点在于:年份范围要合理(比如近10年到未来5年),月份必须补零("01" 而非 "1"),否则后端解析易出错。
<select name="month"><option value="">请选择月份</option> <option value="2024-01">2024年1月</option> <option value="2024-02">2024年2月</option> <option value="2024-03">2024年3月</option></select>
实际项目中建议用 JS 生成选项,避免硬编码。注意:不要把中文“一月”作为 value,后端接收时无法直接转成标准日期类型。
<input type="month"> 的验证和样式限制很实在
该输入框自带基础验证:空值或格式错误(如 "2024-13")提交时会触发浏览器提示。但你不能用 CSS 伪元素(如 ::-webkit-inner-spin-button)隐藏 Chrome 的上下箭头,也不能用 placeholder 属性——它被忽略。
如果需要自定义外观或增强交互(比如联动年份选择),就得放弃原生控件,改用第三方库(如 flatpickr)或自己封装。但代价是增加 bundle 体积、维护成本,以及手动处理键盘输入、焦点管理等细节。
后端接收时别假设格式一定合法
即使前端用了 type="month",也不能信任传来的值:用户可能禁用 JS、篡改表单、或用 curl 发送非法数据。后端必须校验 value 是否匹配 /^\d{4}-(0[1-9]|1[0-2])$/,并检查月份是否在有效范围内(比如 "2024-00" 或 "2024-13" 都是非法的)。
容易被忽略的一点是时区影响:<input type="month"> 的值始终按本地时区解释,但服务器可能在不同时区运行。如果业务对时间精度敏感(例如财务结算),最好在提交时额外带上客户端时区偏移,或统一要求前端转为 UTC 时间再截取年月。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











