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

IE11中getFullYear()解析日期返回负值问题

问题原因与解决方案

这问题我太熟了,IE的Date对象解析逻辑简直是前端老坑!

为什么IE返回-18?

Chrome、Firefox这些现代浏览器的Date解析引擎对非标准日期格式的容错性很强,能自动推断Mar 15/18是“3月15日,2018年”,所以getFullYear()返回2018完全正常。

但IE的解析规则非常死板,它根本不认识这种“月份 日/年”的格式,解析时出现了错误的计算逻辑——它可能把15/18错误解读成了某种超出常规范围的日期参数,最终导致年份被计算为公元前18年(也就是-18)。这种兼容性差异在旧IE里太常见了。

靠谱的解决方案:手动解析日期

既然依赖浏览器自动解析不可靠,咱们就自己拆分字符串处理,保证在所有浏览器里行为一致:

var d = 'Mar 15/18';
// 拆分日期字符串
var [monthStr, dayYearStr] = d.split(' ');
var [day, shortYear] = dayYearStr.split('/').map(str => parseInt(str, 10));

// 处理两位年份,转成四位(这里默认小于100的年份是20xx,可根据需求调整)
var fullYear = shortYear < 100 ? shortYear + 2000 : shortYear;

// 把月份缩写转成Date需要的数字(注意Date月份是0开始的)
var 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
};
var month = monthMap[monthStr];

// 创建标准的Date对象
var dt = new Date(fullYear, month, day);
alert(dt.getFullYear()); // 现在IE和Chrome都会返回2018

额外提醒

如果你的项目里有大量日期处理需求,也可以考虑用成熟的日期库(比如Moment.js、Day.js)来规避浏览器兼容性问题,但如果只是这一处场景,手动解析足够轻量可靠。

内容的提问来源于stack exchange,提问作者crappyprog

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 09:19:45