JavaScript日期格式dd-MMM-yyyy在IE中无法正常工作求助
解决IE中dd-MMM-yyyy格式日期解析失败的问题
这个坑我之前踩过!IE对非标准日期格式的支持一直很不友好,尤其是你用的这种dd-MMM-yyyy格式(比如"02-MAY-2018"),现代浏览器像Chrome会自动兼容解析,但IE完全不认,直接返回Invalid Date,导致你的日期比对逻辑失效。
问题根源
ECMAScript标准并没有强制要求浏览器支持dd-MMM-yyyy这种特定的日期字符串格式,Chrome等现代浏览器是额外实现了对它的解析,而IE严格遵循早期标准,只支持少数几种格式(比如ISO 8601格式yyyy-MM-dd,或者美式的MM/dd/yyyy),所以直接用new Date("02-MAY-2018")在IE里会报错。
解决方案:手动解析日期字符串
最稳妥的方式是自己写一个解析函数,把dd-MMM-yyyy格式的字符串拆分成日、月、年,再转换成浏览器都能识别的Date对象。这里给你两种实现方式:
方式1:直接构造Date对象
通过月份缩写映射表,把三个字母的月份转换成数字,再用Date(year, monthIndex, day)构造日期(注意月份是从0开始的):
function parseDDMMMYYYY(dateStr) { // 月份缩写转数字(0-11) const monthMap = { "JAN": 0, "FEB": 1, "MAR": 2, "APR": 3, "MAY": 4, "JUN": 5, "JUL": 6, "AUG": 7, "SEP": 8, "OCT": 9, "NOV": 10, "DEC": 11 }; const parts = dateStr.split('-'); const day = parseInt(parts[0], 10); const month = monthMap[parts[1].toUpperCase()]; // 统一转大写避免大小写问题 const year = parseInt(parts[2], 10); return new Date(year, month, day); } // 修改你的验证逻辑: const targetDate = parseDDMMMYYYY("02-MAY-2018"); const userDOB = parseDDMMMYYYY(this.dob); if (targetDate.toDateString() === userDOB.toDateString()) { alert("No error"); } else { alert("error"); }
方式2:转换成ISO标准格式
把dd-MMM-yyyy转成浏览器都支持的ISO 8601格式yyyy-MM-dd,再用new Date()解析:
function convertToISO(dateStr) { const monthMap = { "JAN": "01", "FEB": "02", "MAR": "03", "APR": "04", "MAY": "05", "JUN": "06", "JUL": "07", "AUG": "08", "SEP": "09", "OCT": "10", "NOV": "11", "DEC": "12" }; const parts = dateStr.split('-'); // 拼接成yyyy-MM-dd格式 return `${parts[2]}-${monthMap[parts[1].toUpperCase()]}-${parts[0]}`; } // 修改验证逻辑: const targetDate = new Date(convertToISO("02-MAY-2018")); const userDOB = new Date(convertToISO(this.dob)); if (targetDate.toDateString() === userDOB.toDateString()) { alert("No error"); } else { alert("error"); }
注意事项
- 记得把输入的日期字符串统一转成大写(或者小写),避免因为月份缩写大小写不一致导致映射失败;
- 永远不要依赖浏览器对非标准日期格式的解析能力,不同浏览器甚至同一浏览器的不同版本都可能有差异,手动解析/转标准格式是跨浏览器兼容的最优解。
内容的提问来源于stack exchange,提问作者Sridhar Paiya
相关产品推荐
相关产品推荐

