日期计算是 Excel 里最容易被「看起来对但其实是错」坑到的地方。
根源是一件事:Excel 里的日期,本质上是个数字。 如果你还没建立这个直觉,先看 最值得先学的 10 个函数 里关于 TEXT 的部分。
先搞懂这一点,后面全通
在 Excel 里输入 `2026-10-21`,它实际存的是 `46316`。
意思是:从 1900 年 1 月 1 日开始数的第 46316 天。
你可以验证:把单元格格式改成"常规",日期就变成了数字。
这也解释了一个经典问题:为什么两个日期相减,结果变成一个莫名其妙的数字? 因为结果单元格的格式还是"日期",`46316 - 46200 = 116` 天,被显示成了 `1900-04-25`。改成"常规"就对了。
最简单的:两个日期相减
结果就是天数差。但记得把结果单元格格式改成"常规"或"数值"。
如果只要工作日天数(去掉周末):
要去掉法定节假日,加第三个参数(一个列出假期的区域):
算工龄:DATEDIF
DATEDIF 是个"隐藏函数"——你在函数列表里找不到它,但可以直接用。
意思是:从入职日期到今天,整几年。
第三个参数(单位)有六种:
| 单位 | 含义 | 例子(2020-03-15 到 2026-10-21) |
|---|---|---|
| `"Y"` | 整年数 | 6 |
| `"M"` | 整月数 | 79 |
| `"D"` | 天数 | 2412 |
| `"YM"` | 去掉整年后的月数 | 7 |
| `"MD"` | 去掉整年月后的天数 | 6 |
| `"YD"` | 去掉整年后的天数 | 220 |
做成"6 年 7 个月"的样子
`&` 是拼接符号,把数字和文字连起来。
算到期日:EDATE 和 EOMONTH
EDATE:N 个月后的同一天
A2 是 `2026-01-15`,结果是 `2026-04-15`。负数就是往前推。
典型用途:合同期、保修期、账期。
EOMONTH:某个月的最后一天
A2 是 `2026-02-10`,结果是 `2026-02-28`(2026 年不是闰年)。
第二个参数是"往后推几个月":
- `0` = 本月最后一天
- `1` = 下月最后一天
- `-1` = 上月最后一天
典型用途:算月结日、算账期截止、"本月最后一天"这种报表标题。
提取年月日
算星期几:
第二个参数填 `2` 表示"周一=1,周日=7"(符合中国人习惯)。不填的话是"周日=1"。
想要"星期一"这三个字,用 TEXT:
最坑的一个问题:日期变成了文本
从系统导出、从网页复制、别人发来的表,日期经常是文本格式。
表现是:左对齐(真日期是右对齐)、不能相减、`YEAR()` 返回 `#VALUE!`。
怎么判断
返回 `FALSE` 就是文本。
怎么修
方法一:分列
选中这一列 → 数据 → 分列 → 直接点"完成"。Excel 会重新识别一遍格式。这是最快的批量修复法。
方法二:公式转换
或者更粗暴的:
两个减号(叫"负负得正")会强制把文本转成数字。转完记得把格式设成日期。
方法三:TEXT 反向构造
适合固定格式的字符串,比如 `20261021`。
常见错误速查
| 现象 | 原因 | 解决 |
|---|---|---|
| 相减得到 1900-xx-xx | 结果单元格格式是日期 | 改成"常规" |
| `#VALUE!` | 参与计算的日期是文本 | `--` 或分列转换 |
| DATEDIF 报 `#NUM!` | 开始日期晚于结束日期 | 用 IFERROR 包起来 |
| WEEKDAY 结果差一天 | 第二参数没设 | 填 2 |
| 算出来的天数差 1 | 是否包含当天 | 需要包含就 +1 |
一句话总结
日期就是数字。相减得天数是数字运算,DATEDIF 算年月,EDATE 推月份,EOMONTH 找月末。日期是文本的时候,用 `--` 或分列先转过来。
评论 0