=NETWORKDAYS(A2,B2) 计算从 A2 的日期到 B2 的日期之间的工作日天数,两端都计入,工作日指星期一至星期五。=WORKDAY(A2,10) 方向相反:它返回 A2 之后第 10 个工作日的日期。
| A | B | C | D | |
|---|---|---|---|---|
| 1 | Start | End | Working days | Calendar days |
| 2 | 2026-03-02 | 2026-03-13 | 10 | 12 |
| 3 | 2026-03-02 | 2026-03-31 | 22 | 30 |
| 4 | 2026-03-06 | 2026-03-09 | 2 | 4 |
| 5 | 2026-03-07 | 2026-03-08 | 0 | 2 |
第一个项目从星期一持续到下一周的星期五:12 个日历日,10 个工作日。2026 年 3 月从 2 日起共有 22 个工作日。星期五到下周一是 2,只有周末则是 0。改一个结束日期,看看天数如何变化。(只算普通天数请看两个日期之间的天数。)
带节假日的 NETWORKDAYS
第三个参数是除周末之外还要跳过的日期区域。把节假日单独放一列(或放在另一个工作表),并用 $ 锁定区域,这样公式向下填充时区域不会移动。
| A | B | C | D | E | |
|---|---|---|---|---|---|
| 1 | Start | End | No holidays | With holidays | Holidays |
| 2 | 2026-03-30 | 2026-04-10 | 10 | 8 | 2026-04-03 |
| 3 | 2026-04-01 | 2026-04-30 | 22 | 20 | 2026-04-06 |
| 4 | 2026-04-27 | 2026-05-08 | 10 | 9 | 2026-05-01 |
3 月 30 日到 4 月 10 日有 10 个工作日,其中两天是节假日(2026 年的耶稣受难日和复活节星期一),所以是 8 个工作日。只有落在各自时间段内的节假日才会被减去:最后一行只少了 5 月 1 日。删掉 E 列中的某个节假日,天数就会回升。
WORKDAY:按工作日算截止日期
WORKDAY(start_date, days, [holidays]) 返回开始日期之后若干个工作日的日期。开始日期本身不计入,结果永远不会是周末或节假日。
| A | B | C | D | E | |
|---|---|---|---|---|---|
| 1 | Received | Days | Due | Due (holidays) | Holidays |
| 2 | 2026-03-27 | 10 | 2026-04-10 | 2026-04-14 | 2026-04-03 |
| 3 | 2026-04-02 | 3 | 2026-04-07 | 2026-04-09 | 2026-04-06 |
| 4 | 2026-04-24 | 5 | 2026-05-01 | 2026-05-04 | 2026-05-01 |
星期五 2026-03-27 收到的请求,期限 10 个工作日,截止日期是 2026-04-10;跳过耶稣受难日和复活节星期一后则是 2026-04-14。天数为负时 WORKDAY 往前数:=WORKDAY(A2,-5) 是一周前的那个工作日。要找“下一个工作日”就用 1;如果日期本身已是工作日并想保留它,用 =WORKDAY(A2-1,1)。
其他周末:NETWORKDAYS.INTL
如果周末不是星期六和星期日,NETWORKDAYS.INTL 的第三个参数是周末代码,第四个参数才是节假日。
| 周末 | 代码 |
|---|---|
| 星期六、星期日 | 1(默认) |
| 星期日、星期一 | 2 |
| 星期五、星期六 | 7 |
| 仅星期日 | 11 |
| 仅星期六 | 17 |
| 任意组合 | 7 个字符,从星期一开始,1 = 休息日:"0000011" |
| A | B | C | D | E | F | |
|---|---|---|---|---|---|---|
| 1 | Weekend | Code | Working days | Start | End | |
| 2 | Saturday and Sunday | 1 | 22 | 2026-03-01 | 2026-03-31 | |
| 3 | Friday and Saturday | 7 | 23 | |||
| 4 | Sunday only | 11 | 26 | |||
| 5 | Mon, Wed, Fri only | 0101011 | 13 |
周末为星期六和星期日时,2026 年 3 月有 22 个工作日;周末为星期五和星期六时有 23 个;只休星期日时有 26 个。最后一行是兼职安排:0101011 表示除周末外星期二和星期四也休息,剩下 13 天。在单元格中,0101011 这样的代码必须是文本(输入时加一个前导撇号,'0101011),否则 Excel 会去掉开头的 0。
WORKDAY.INTL 对截止日期做同样的事。下面是 Excel 计算 2026 年 3 月 2 日(星期一)之后 10 个工作日的结果:
=WORKDAY.INTL(DATE(2026,3,2), 10) 2026-03-16 (Saturday and Sunday off)
=WORKDAY.INTL(DATE(2026,3,2), 10, 7) 2026-03-16 (Friday and Saturday off)
=WORKDAY.INTL(DATE(2026,3,2), 10, 11) 2026-03-13 (Sunday off)
=WORKDAY.INTL(DATE(2026,3,2), 10, "0000011") 2026-03-16 (same as code 1)
练习:工作日与截止日期
| A | B | C | D | E | |
|---|---|---|---|---|---|
| 1 | Start | End | Working days | Holidays | |
| 2 | 2026-04-01 | 2026-04-30 | 2026-04-03 | ||
| 3 | 2026-04-06 |
轮到你了: 在 C2 中计算从 A2 到 B2 的工作日天数,两端都计入,并跳过 E2:E3 中的节假日。
| A | B | C | |
|---|---|---|---|
| 1 | Received | Days | Due |
| 2 | 2026-05-14 | 8 |
轮到你了: 在 C2 中返回 A2 日期之后第 B2 个工作日的日期(跳过周末,没有节假日)。
NETWORKDAYS 两端都算,WORKDAY 不算开始日期
这两个函数在开始日期上相差 1,同时使用它们的人常会因此吃惊。NETWORKDAYS 从星期一到同周星期五是 5:两天都计入。WORKDAY 从那个星期一加 5 天,会落在下周一,因为它从第二天开始数。
| A | B | C | |
|---|---|---|---|
| 1 | Start | WORKDAY(A2,5) | NETWORKDAYS back |
| 2 | 2026-03-02 | 2026-03-09 | 6 |
WORKDAY 返回 2026-03-09,而 NETWORKDAYS 从 2026-03-02 到这一天得到 6,不是 5。如果截止期限是“5 个工作日内,含今天”,且 A2 是工作日,就用 =WORKDAY(A2,4)。和团队定好采用哪种约定,并写在公式旁边。
常见问题
Excel 中如何计算两个日期之间的工作日天数?
=NETWORKDAYS(A2,B2) 计算从 A2 到 B2 之间星期一至星期五的天数,两个日期都计入。把节假日日期区域作为第三个参数,就能把它们也跳过:=NETWORKDAYS(A2,B2,$E$2:$E$4)。
Excel 中如何在日期上加工作日?
=WORKDAY(A2,10) 返回 A2 之后第 10 个工作日的日期,跳过星期六和星期日。负数表示往前推:=WORKDAY(A2,-5)。节假日区域作为第三个参数传入。
NETWORKDAYS 和 NETWORKDAYS.INTL 有什么区别?
NETWORKDAYS 总是把星期六和星期日当作周末。NETWORKDAYS.INTL 多一个周末参数:7 表示星期五和星期六,11 表示只有星期日,也可以用 "0000011" 这样的 7 位字符串,从星期一开始,1 表示休息日。
NETWORKDAYS 包含开始日期吗?
包含。只要开始日期和结束日期是工作日,NETWORKDAYS 都会计入,所以从星期一到同周星期五是 5。WORKDAY 不计开始日期:=WORKDAY(A2,1) 就是下一个工作日。
节假日落在周末会怎样?
不会多扣:NETWORKDAYS 和 WORKDAY 本来就跳过周末,所以落在星期六的节假日不会被减两次。