Excel 处理日期和时间的能力,在日常办公中使用频率极高。合同还有几天到期、员工入职到现在满了几年、项目排期从开工到交付一共多少个工作日、考勤表里某个日期是星期几——这些问题手动去数日历既慢又容易出错。Excel 提供了一整套日期与时间函数,可以拆分日期中的年月日、计算两个日期之间的间隔、推算未来或过去的日期,甚至自动排除周末和节假日来计算工作日。
在学习这些函数之前,有一个底层概念需要先理解清楚:Excel 中的日期本质上是一个数字。1900 年 1 月 1 日被编号为 1,1900 年 1 月 2 日是 2,以此类推。2025 年 7 月 1 日对应的序列号是 45839。单元格里看到的「2025/7/1」只是这个数字的一种显示格式,和把 0.5 显示为「50%」是同一个道理。理解了这一点,后面遇到日期相减、日期加天数等操作时就不会觉得奇怪——日期相减就是两个数字相减,日期加 30 就是序列号加 30。
在任意单元格输入一个日期,然后把该单元格的格式从「日期」改为「常规」,就能看到这个日期对应的序列号。反过来,输入一个整数 45000,再把格式改为「短日期」,会显示为 2023/3/15。日期和数字之间可以随意切换,因为它们本质上是同一个东西。
工作中经常需要从一个完整的日期中单独提取年份、月份或天数。员工花名册里有入职日期,需要按入职年份分组统计;销售数据按月汇总时,需要从订单日期中提取月份;计算某个日期是当月第几天,也需要把天数单独拆出来。YEAR、MONTH、DAY 三个函数分别完成这三件事。
从日期中提取四位数的年份。
=YEAR(日期)
假设 A2 单元格中的日期是 2023/6/15:
=YEAR(A2)
返回结果是 2023。
一份员工花名册中 D 列是入职日期,需要在 E 列标注每位员工的入职年份,方便后续按年份筛选。在 E2 输入 =YEAR(D2) 然后向下填充,整列入职年份就生成了。如果想进一步判断员工是否属于「老员工」(2020 年之前入职),可以配合 IF 函数:=IF(YEAR(D2)<2020,"老员工","新员工")。
从日期中提取月份,返回 1 到 12 的整数。
=MONTH(日期)
一份全年销售订单表,B 列是下单日期,需要在 C 列标注月份用于按月汇总。在 C2 输入 =MONTH(B2),返回的就是该订单所属的月份。配合 SUMIF 函数,就可以快速计算每个月的销售总额。
从日期中提取日,返回 1 到 31 的整数。
=DAY(日期)
应用场景相对集中:判断某个日期是当月第几天、检查发薪日或还款日是否到了。如果公司规定每月 15 号发工资,可以用 =IF(DAY(TODAY())=15,"今天发薪","") 做一个简单的提醒。
三个函数的语法完全一致,参数都只有一个——日期值。它们经常组合使用:=YEAR(A2)&"年"&MONTH(A2)&"月" 可以拼出「2024年9月」这样的中文格式文本。
和 YEAR、MONTH、DAY 拆分日期类似,HOUR 和 MINUTE 用于从时间值中提取小时和分钟。
从时间值中提取小时部分,返回 0 到 23 的整数。
=HOUR(时间)
假设 A2 中记录的考勤打卡时间是 8:47:30,=HOUR(A2) 返回 8。如果是下午 14:20:00,返回 14。
从时间值中提取分钟部分,返回 0 到 59 的整数。
=MINUTE(时间)
考勤系统导出的打卡记录中,需要判断员工是否迟到(上班时间 9:00)。在打卡时间旁边新增一列,输入公式 =IF(HOUR(A2)>9,"迟到",IF(HOUR(A2)=9,IF(MINUTE(A2)>0,"迟到","准时"),"准时")),可以自动标注迟到状态。不过这个公式写起来有些繁琐,更简洁的做法是直接比较时间值:=IF(A2>TIME(9,0,0),"迟到","准时")。
Excel 中的时间同样是数字。一天等于 1,所以 12:00:00(中午)对应的数值是 0.5,6:00:00 对应 0.25,18:00:00 对应 0.75。如果一个单元格同时包含日期和时间(如 2024/9/28 14:30),它的序列号就是日期部分的整数加上时间部分的小数。
有些场景需要表格中始终显示当前的日期或时间——倒计时天数、文件打印时自动标注日期、实时显示最后更新时间。TODAY 和 NOW 两个函数专门解决这个需求。
返回当前系统日期,不包含时间部分。
=TODAY()
TODAY 没有参数,括号里什么都不用填。每次打开工作簿或工作表重新计算时,它的值会自动更新为当天日期。
实用场景:在表格角落放一个 ="数据更新日期:"&TEXT(TODAY(),"YYYY年M月D日"),每次打开文件自动显示当天日期,不需要手动修改。
计算距离某个截止日期还剩多少天也很直接。假设 B2 是合同到期日期:
=B2-TODAY()
结果就是剩余天数。如果返回负数,说明已经过期了。
返回当前系统日期和时间,精确到秒。
=NOW()
同样没有参数。NOW 比 TODAY 多了时间部分,适合需要记录精确时间戳的场景。
TODAY 和 NOW 的核心区别:
TODAY 和 NOW 是「易变函数」,每次工作表发生任何计算时都会重新求值。如果表格中大量使用这两个函数,可能会拖慢计算速度。另外,因为值会不断变化,不适合用来做永久性的时间记录——今天显示 2025/7/1,明天打开就变成 2025/7/2 了。如果需要固定一个时间戳,应该用 Ctrl+;(输入当前日期)或 Ctrl+Shift+;(输入当前时间),这两个快捷键输入的是固定值,不会随时间变化。
YEAR、MONTH、DAY 是把日期拆开,DATE 函数则反过来——用单独的年、月、日三个数字拼成一个完整的日期。
=DATE(年, 月, 日)
三个参数分别对应年份、月份和日期,都必须是数字。
=DATE(2024, 12, 25)
返回 2024/12/25。看起来好像没什么用,直接在单元格里输入日期不就行了?DATE 函数的价值体现在年、月、日分散在不同单元格的场景中。
一份从旧系统导出的数据,年份在 A 列,月份在 B 列,日期在 C 列,三个数字分开存放,没法直接当日期使用。在 D 列输入 =DATE(A2,B2,C2) 就能把三列数字合成一个标准日期,后续可以正常排序、筛选、计算天数差。
DATE 函数还有一个隐藏特性:它会自动处理溢出。=DATE(2024,13,1) 不会报错,而是返回 2025/1/1——第 13 个月自动进位到下一年的 1 月。同理,=DATE(2024,1,32) 返回 2024/2/1,第 32 天自动进到下个月。这个特性在日期推算时非常有用。
利用这个溢出特性,可以快速获取某月的最后一天:=DATE(2024,3,1)-1 返回 2024/2/29(3 月 1 日往前退一天),不需要判断是否闰年、这个月有 28 天还是 31 天——DATE 函数会自动处理。更通用的写法是 =DATE(YEAR(A2),MONTH(A2)+1,0),无论 A2 是几月几号,都能返回当月最后一天。
DATEDIF 是日期函数中功能最强的一个,专门用于计算两个日期之间的间隔——间隔多少年、多少月或多少天。它的使用场景非常广泛:计算员工工龄、合同剩余期限、年龄、会员有效期等。
=DATEDIF(开始日期, 结束日期, 单位)
三个参数:开始日期必须早于或等于结束日期,否则会返回错误;第三个参数「单位」决定了以什么维度来计算间隔。
「完整年数」的意思是满打满算的年,不满一年的零头不计入。2020/3/15 到 2024/3/14 算 3 年(差一天不满 4 年),到 2024/3/15 才算 4 年。「完整月数」同理。
一份员工花名册,C 列是入职日期,需要在 D 列显示每位员工的工龄(精确到年):
=DATEDIF(C2,TODAY(),"Y")
配合 TODAY 函数,工龄会随时间自动更新。今天是 2025/7/1,如果入职日期是 2020/6/15,返回 5;如果入职日期是 2020/8/20,返回 4(还没满 5 年)。

如果需要更精确的表述,比如「4年6个月」,可以组合使用两个 DATEDIF:
=DATEDIF(C2,TODAY(),"Y")&"年"&DATEDIF(C2,TODAY(),"YM")&"个月"
这里的 "YM" 是一个额外的单位参数,表示「扣除完整年数后剩余的月数」。类似的还有 "MD"(扣除完整月数后剩余的天数)。
用这三组单位组合,就能拼出「4年6个月13天」这样的精确表述:
=DATEDIF(C2,TODAY(),"Y")&"年"&DATEDIF(C2,TODAY(),"YM")&"个月"&DATEDIF(C2,TODAY(),"MD")&"天"
DATEDIF 计算年龄同样方便。如果 B 列是出生日期:
=DATEDIF(B2,TODAY(),"Y")
返回的就是周岁。用这个公式做的年龄列会随着时间自动更新——员工过了生日之后,年龄会自动加 1,不需要人工维护。
DATEDIF 是 Excel 中一个「隐藏函数」——在输入公式时不会出现自动补全提示,Excel 的官方帮助文档中也很少提及它。但它确实可以正常使用,并且在计算日期间隔方面没有替代品。输入时需要完全手动拼写函数名,不要等自动提示。
WEEKDAY 函数返回一个日期对应的星期几,用数字表示。排班表需要标注每天是星期几、考勤系统判断某天是否周末、表格中按工作日和休息日分类统计——这些场景都离不开它。
=WEEKDAY(日期, [返回类型])
第一个参数是日期,第二个参数控制星期的编号规则,可以省略。
返回类型 1 是默认值,从星期日开始计数。国内工作中更习惯星期一作为一周的第一天,建议使用返回类型 2:
=WEEKDAY(A2, 2)
如果 A2 是 2025/7/1(星期二),返回类型 2 下结果为 2。
要把数字转换成中文的「星期X」显示,可以用 CHOOSE 函数配合:
=CHOOSE(WEEKDAY(A2,2),"星期一","星期二","星期三","星期四","星期五","星期六","星期日")
判断某天是否为工作日(周一到周五):
=IF(WEEKDAY(A2,2)<=5,"工作日","休息日")
一份月度排班表,A 列是 1 号到 31 号的日期,B 列用上面的公式自动标注星期几,C 列用工作日判断公式标注「工作日」或「休息日」,整个月的日历结构一目了然,排班时不需要再翻日历。
前面的函数都是在已有日期上做拆分或比较,这三个函数的功能是从一个已知日期出发,向前或向后推算出另一个日期,或者计算两个日期之间有多少个工作日。它们在合同管理、项目排期、人事考勤等场景中使用非常频繁。
计算某个日期之前或之后 N 个月的日期。
=EDATE(起始日期, 月数)
月数为正数表示往后推,负数表示往前推。
=EDATE("2024/3/15", 6)
返回 2024/9/15——3 月 15 日往后推 6 个月。
=EDATE("2024/3/15", -3)
返回 2023/12/15——往前推 3 个月。
EDATE 最常见的用途是计算合同到期日。一份合同台账中,B 列是签约日期,C 列是合同期限(月数),D 列需要计算到期日期:
=EDATE(B2, C2)
如果签约日期是 2024/1/20,合同期限是 12 个月,返回 2025/1/20。签约日期是 2024/3/31,合同期限 1 个月,返回 2024/4/30——EDATE 会自动处理月末的情况,3 月 31 号加一个月不会变成 4 月 31 号(4 月没有 31 号),而是自动调整为 4 月 30 号。

配合 TODAY 函数,可以做合同到期预警:
=IF(EDATE(B2,C2)-TODAY()<=30,"即将到期","正常")
到期日距今不足 30 天的合同自动标记为「即将到期」。
从一个日期开始,跳过周末(周六和周日),计算 N 个工作日后的日期。
=WORKDAY(起始日期, 工作日天数, [节假日])
前两个参数是必填的,第三个参数「节假日」是可选的——传入一个包含节假日日期的区域,这些日期在计算时会被自动跳过。
=WORKDAY("2025/7/1", 10)
从 2025 年 7 月 1 日开始,往后数 10 个工作日(自动跳过中间的周六和周日),返回 2025/7/15。
项目管理中经常需要计算「从今天起 20 个工作日后是哪天」来确定交付日期。直接加 20 天会把周末也算进去,导致预估偏早。用 WORKDAY 就不会出这个问题。
工作日天数为负数时,表示往前推算:
=WORKDAY("2025/7/15", -10)
返回 2025/7/1——从 7 月 15 日往前数 10 个工作日。
WORKDAY 默认只跳过周六和周日,但实际工作中还需要排除国定假日。把需要排除的节假日日期集中写在工作表的某一列(假设 G 列 G2:G10 列了春节、清明、劳动节等假期日期),然后在公式中引用这个区域:
=WORKDAY("2025/1/20", 15, G2:G10)
计算时会同时跳过周末和 G2:G10 中列出的所有节假日。
节假日列表需要手动维护。每年年底国务院公布下一年的放假安排后,在 G 列更新对应的日期即可。调休上班的日子不需要从列表中去掉——WORKDAY 只看周末和你提供的节假日列表,调休日如果是工作日(周六变工作日),WORKDAY 默认仍会跳过它。如果需要精确处理调休,可以考虑用 WORKDAY.INTL 函数自定义周末模式。
WORKDAY 是「已知起点和工作日天数,求终点日期」;NETWORKDAYS 正好反过来——「已知起点和终点,求中间有多少个工作日」。
=NETWORKDAYS(开始日期, 结束日期, [节假日])
=NETWORKDAYS("2025/7/1", "2025/7/31")
返回 23——2025 年 7 月一共有 23 个工作日(排除了所有周六和周日)。
一份考勤表需要计算某位员工当月应出勤天数:
=NETWORKDAYS(DATE(2025,7,1), DATE(2025,7,31), G2:G10)
加上节假日参数后,国定假日也会被排除,返回的就是扣除周末和节假日后的实际应出勤天数。

用 NETWORKDAYS 还能反过来算出勤率。如果 D 列是实际出勤天数,E 列用 NETWORKDAYS 算出应出勤天数,出勤率就是 =D2/E2,格式设为百分比即可。
EDATE 按自然月推算,不关心周末;WORKDAY 和 NETWORKDAYS 都会自动跳过周末,并且支持节假日参数。WORKDAY 和 NETWORKDAYS 互为逆运算——一个从天数求日期,一个从日期求天数。
下面这张表把本章涉及的所有函数放在一起,方便查阅和对比。
日期函数的核心思路可以归纳为三类操作:拆(YEAR、MONTH、DAY、HOUR、MINUTE 从日期时间中提取分量)、造(DATE、TODAY、NOW 生成日期)、算(DATEDIF、EDATE、WORKDAY、NETWORKDAYS 在日期之间做间隔计算和推算)。理解了日期本质是序列号之后,这些函数的行为都变得很直观——拆就是从序列号中解码出对应分量,造就是把分量编码回序列号,算就是在序列号上做加减和计数。