Excel 日期计算:算工龄、算天数、算到期日(DATEDIF 全解)

2026-10-21 7 次浏览 Excel 函数
日期在 Excel 里其实是个数字。搞懂这一点,算工龄、算账期、算到期日全都通了。含 DATEDIF 的六个参数、EOMONTH、NETWORKDAYS,以及最常见的"日期变文本"陷阱。
=DATEDIF(开始日期, 结束日期, "单位")
用途算出两个日期之间相差几年、几个月、几天。

日期计算是 Excel 里最容易被「看起来对但其实是错」坑到的地方。

关键日期算出来是数字,往往要用 TEXT 转成好看的样子,见 Excel 文本处理。

根源是一件事:Excel 里的日期,本质上是个数字。 如果你还没建立这个直觉,先看 最值得先学的 10 个函数 里关于 TEXT 的部分。

先搞懂这一点,后面全通

在 Excel 里输入 `2026-10-21`,它实际存的是 `46316`。

意思是:从 1900 年 1 月 1 日开始数的第 46316 天。

你可以验证:把单元格格式改成"常规",日期就变成了数字。

关键为什么要知道这个:因为只有数字才能相减。日期能算天数差,正是因为它们背后是数字。

这也解释了一个经典问题:为什么两个日期相减,结果变成一个莫名其妙的数字? 因为结果单元格的格式还是"日期",`46316 - 46200 = 116` 天,被显示成了 `1900-04-25`。改成"常规"就对了。

最简单的:两个日期相减

=B2-A2

结果就是天数差。但记得把结果单元格格式改成"常规"或"数值"。

如果只要工作日天数(去掉周末):

=NETWORKDAYS(A2, B2)

要去掉法定节假日,加第三个参数(一个列出假期的区域):

=NETWORKDAYS(A2, B2, $F$2:$F$12)
关键注意 NETWORKDAYS 默认去掉周六周日。如果你公司是单休,它就不适用,得用 NETWORKDAYS.INTL 自定义休息日。

算工龄:DATEDIF

DATEDIF 是个"隐藏函数"——你在函数列表里找不到它,但可以直接用。

=DATEDIF(A2, TODAY(), "Y")

意思是:从入职日期到今天,整几年。

第三个参数(单位)有六种:

单位含义例子(2020-03-15 到 2026-10-21)
`"Y"`整年数6
`"M"`整月数79
`"D"`天数2412
`"YM"`去掉整年后的月数7
`"MD"`去掉整年月后的天数6
`"YD"`去掉整年后的天数220
关键最常用的是 `"Y"`(工龄年数)和 `"YM"`("6 年 7 个月"里的那个 7)。

做成"6 年 7 个月"的样子

=DATEDIF(A2,TODAY(),"Y")&"年"&DATEDIF(A2,TODAY(),"YM")&"个月"

`&` 是拼接符号,把数字和文字连起来。

关键注意 `"Y"` 和 `"YM"` 必须加引号,因为它们是文本参数,不是单元格。
易错DATEDIF 有个坑:如果开始日期晚于结束日期,它会返回 `#NUM!`。做模板给别人用时,外面套一层 `IFERROR` 更稳妥。

算到期日:EDATE 和 EOMONTH

EDATE:N 个月后的同一天

=EDATE(A2, 3)

A2 是 `2026-01-15`,结果是 `2026-04-15`。负数就是往前推。

典型用途:合同期、保修期、账期。

=EDATE(签约日, 12) —— 一年后的到期日

EOMONTH:某个月的最后一天

=EOMONTH(A2, 0)

A2 是 `2026-02-10`,结果是 `2026-02-28`(2026 年不是闰年)。

第二个参数是"往后推几个月":

  • `0` = 本月最后一天
  • `1` = 下月最后一天
  • `-1` = 上月最后一天

典型用途:算月结日、算账期截止、"本月最后一天"这种报表标题。

关键一个经典组合:`=EOMONTH(TODAY(),-1)+1` 得到"本月第一天"。很多月报模板都用这个。

提取年月日

=YEAR(A2) → 2026
=MONTH(A2) → 10
=DAY(A2) → 21

算星期几:

=WEEKDAY(A2, 2)

第二个参数填 `2` 表示"周一=1,周日=7"(符合中国人习惯)。不填的话是"周日=1"。

想要"星期一"这三个字,用 TEXT:

=TEXT(A2, "aaaa")
关键`"aaaa"` 输出"星期五",`"aaa"` 输出"周五"。这个格式代码只在中文版 Excel 里有效。

最坑的一个问题:日期变成了文本

从系统导出、从网页复制、别人发来的表,日期经常是文本格式。

表现是:左对齐(真日期是右对齐)、不能相减、`YEAR()` 返回 `#VALUE!`。

怎么判断

=ISNUMBER(A2)

返回 `FALSE` 就是文本。

怎么修

方法一:分列

选中这一列 → 数据 → 分列 → 直接点"完成"。Excel 会重新识别一遍格式。这是最快的批量修复法。

方法二:公式转换

=DATEVALUE(A2)

或者更粗暴的:

=--A2

两个减号(叫"负负得正")会强制把文本转成数字。转完记得把格式设成日期。

关键这个方法对 `2026/10/21`、`2026-10-21` 这类标准写法有效。如果格式很乱(比如 `2026年10月21日`),得先用替换把"年月日"换成 `-`。

方法三:TEXT 反向构造

=DATE(LEFT(A2,4), MID(A2,6,2), MID(A2,9,2))

适合固定格式的字符串,比如 `20261021`。

常见错误速查

现象原因解决
相减得到 1900-xx-xx结果单元格格式是日期改成"常规"
`#VALUE!`参与计算的日期是文本`--` 或分列转换
DATEDIF 报 `#NUM!`开始日期晚于结束日期用 IFERROR 包起来
WEEKDAY 结果差一天第二参数没设填 2
算出来的天数差 1是否包含当天需要包含就 +1

一句话总结

日期就是数字。相减得天数是数字运算,DATEDIF 算年月,EDATE 推月份,EOMONTH 找月末。日期是文本的时候,用 `--` 或分列先转过来。
关键这几个函数组合起来,能覆盖 95% 的日期需求。剩下的(比如复杂排班、跨时区)属于专业场景,用到再查。

评论 0

还没有评论,来说第一句吧。

发表评论

提交后需审核通过才会显示。

对作品感兴趣?

欢迎交流使用体验、功能建议或技术问题,看到消息我会尽快回复。