You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 10:09:54