edate函数的作用是按月份往前或往后推算日期,最常用的写法是 =edate(开始日期, 月数)。月数填正数就是往后推,填负数就是往前推,本次操作环境是microsoft excel,版本为microsoft 365。
这个函数特别适合算合同到期日、会员续费日、项目复盘日、保质期、还款日这类场景。建议把开始日期单独放在单元格里,别直接在公式里写一长串日期,后面批量填充、修改月数的时候会方便很多。
第一步:整理开始日期和月份数
先准备两列数据:一列放原始开始日期,一列放要增减的月份数。下面示例里把统一的开始日期放在B5单元格,月份数放在D5单元格,公式栏里能看到 =EDATE($B$5,D5),这样用同一个基准开始日期,就能同时算出1个月、3个月、12个月之后的对应日期。

第二步:输入 EDATE 公式
在要输出结果的单元格里输入 =EDATE(A2,B2),A2对应你存的开始日期,B2对应要调整的月份数。输完按回车,单元格就会返回推算后的新日期;要是出来的是一串数字,先别急着重写公式,大多只是单元格没设置成日期格式而已。

第三步:向下填充并核对增减月结果
确认第一个公式结果没问题,直接把单元格往下拉填充就行。月数填5就返回5个月后的日期,填-5就返回5个月前的日期;正负号是用EDATE最容易看错的地方,批量跑全表之前,最好先拿两三行样例核对一遍结果。

第四步:月底场景单独核对
如果你的需求是「每次都取目标月份的最后一天」,别光用EDATE。EDATE默认会尽量保留原日期的「日」数值,比如从1月31日往后推1个月,会自动落到2月28号或者29号(平年/闰年区分);要是必须固定取当月最后一天,可以搭配 =EOMONTH(开始日期, 月数) 来核对结果。

EDATE 函数语法和参数
完整语法是 =EDATE(start_date, months),两个参数都不能空,函数返回的是目标月份对应的日期值,最终显示成日期还是数字,完全由单元格的日期格式决定。
| 参数 | 是否必填 | 写法要点 |
|---|---|---|
start_date |
必填 | 开始日期。建议引用日期单元格,例如 A2;如果直接写日期文本,要用 Excel 能识别的格式。 |
months |
必填 | 要移动的月份数。正数表示向后推,负数表示向前推,0 表示返回开始日期所在月份的同日。 |
常见错误怎么处理
结果出现 #VALUE! 报错,一般是开始日期不是有效日期,或者日期被识别成了普通文本。你可以先把日期所在列设置为日期格式,实在不行就用 DATE(年,月,日) 手动生成合法日期,举个例子:=EDATE(DATE(2026,7,13),3)。
结果显示为 45678 这类纯数字,大概率公式本身没写错。选中整个结果列,把单元格格式改成日期就正常了——Excel内部本来就是把日期存成连续的序列值,显示成啥样全看格式设置。
要是月份参数带小数,Excel只会自动取整数部分计算,别想当然把 1.5 当成「一个半月」来用。另外如果你用的是 WPS 或者很早的旧版 Excel,先提前确认下软件支不支持这个函数。
扩展示例
要算6个月后的到期日,直接写 =EDATE(A2,6) 就行;要算3个月前的复盘日,就写 =EDATE(A2,-3);要是按年推算,直接把年份乘12转成月数,比如算2年后的日期就写 =EDATE(A2,2*12)。
如果你的表格里每行都单独存了开始日期和对应的合同月数,直接写 =EDATE(A2,B2) 就很适合批量填充。想让空白行不自动生成错误日期,可以在外层套个IF判断:=IF(A2="","",EDATE(A2,B2)),这么写不是为了把公式搞复杂,是避免空数据误输出无效日期。











