getDay()在Firefox中对dd-mmm-yyyy格式失效,求跨浏览器兼容方案
解决dd-mmm-yyyy日期格式在Chrome、Safari、Firefox的兼容问题
这个问题我之前也碰到过!Firefox对dd-mmm-yyyy这种非标准日期格式的解析确实很严格,不像Chrome和Safari会自动兼容。核心原因是ECMAScript并没有规定浏览器必须支持这种带月份英文缩写的格式,所以不同厂商的实现差异很大。
要实现三浏览器兼容,有两种可靠的方案:
方案1:手动解析日期字符串
自己控制解析逻辑,完全不依赖浏览器的Date构造函数对非标准格式的处理,这是最稳妥的方式。
写一个自定义解析函数,把dd-mmm-yyyy格式的字符串拆分成日、月缩写、年,再把月份缩写映射成对应的数字(注意Date对象的月份是0索引的,即Jan对应0),最后创建日期对象:
function parseDDMMMYYYY(dateStr) { // 映射月份缩写到对应的0索引数字 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 [dayStr, monthAbbr, yearStr] = dateStr.split('-'); // 转换为数字类型 const day = parseInt(dayStr, 10); const month = monthMap[monthAbbr]; const year = parseInt(yearStr, 10); // 返回标准的Date对象 return new Date(year, month, day); } // 使用示例 const myDate = parseDDMMMYYYY('15-Mar-2024'); console.log(myDate); // 所有浏览器都会输出正确的日期对象
方案2:转换为ISO标准格式
所有现代浏览器都支持ISO 8601格式(yyyy-mm-dd)的日期解析,所以我们可以把dd-mmm-yyyy转换成ISO格式后再创建日期对象:
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 [dayStr, monthAbbr, yearStr] = dateStr.split('-'); // 拼接成yyyy-mm-dd格式 return `${yearStr}-${monthMap[monthAbbr]}-${dayStr}`; } // 使用示例 const isoDate = convertToISO('15-Mar-2024'); // 得到"2024-03-15" const myDate = new Date(isoDate); console.log(myDate); // 所有浏览器都能正确解析
注意事项
- 永远不要直接用
new Date("dd-mmm-yyyy")这种写法,因为这种格式不属于ECMAScript标准,浏览器的解析行为没有统一规范,出现兼容性问题是必然的。 - 如果你的日期字符串中的月份缩写是小写(比如
jan),记得在映射前先转成大写(monthAbbr.toUpperCase()),避免匹配失败。
内容的提问来源于stack exchange,提问作者arnoldtm
相关产品推荐
相关产品推荐

