使用方法
- 在「起始日期」填 2026-09-28(示例值,周一),在「工作日个数 N」填 5(示例值),在「结束日期」填 2026-10-10(示例值)。三个控件打开页面时都已填好,结果也已经算完。
- 两张名单默认按 2026 年全年放假安排填好:节假日 33 行、调休补班日 6 行。名单是纯文本,一行一个日期;要算别的年份或别的地区,直接在框里改。
- 看结果卡第一格:从 2026-09-28 起第 5 个工作日是 2026-10-10,那天是星期六,但因为国庆调休安排上班,被算作工作日——这正是这个工作日计算器最容易被忽略的一环。
- 结果卡后面几格给的是反向统计:2026-09-28 → 2026-10-10 一共 12 个日历天,其中工作日 5 天、节假日 7 天、周末休息 0 天(10 月 3 日、4 日虽然落在周末,但它们在节假日名单里,按互斥口径记入节假日)。
- 下方「正向推算表」把第 1 到第 24 个工作日逐条列出,默认显示前 12 行,点「加载更多」补齐;「复制对照表」按 TSV 复制,「导出 CSV」带 UTF-8 BOM。
- 想只看周末、不管节假日,点「清空两份名单」再算一遍即可——那时得到的就是「只排周末」的纯日历口径。
工作日计算器能解决什么问题
一是把「N 个工作日」落到具体日期。合同写「收到资料后 5 个工作日内答复」、行政写「3 个工作日内办结」,真正要回的是日期。本工具从起始日逐日往后推,遇到周末和节假日就跳过,遇到调休补班日照常计入,直接给出结论日。
二是把两个日期之间的工作日数数清楚。项目结算要算实际工作了多少天、请假单要算跨了几个工作日、工期索赔要算停工占用了几个工作日,用逐日枚举而不是「天数 × 5 ÷ 7」估,才不会在最关键的区间上差出一两天。
三是把调休这个坑一次性填掉。中国的放假安排里既有「放假」,也有「周末上班」,两者都会改变工作日的分布。只按周末排的人,遇到国庆前后会把 9 月 20 日和 10 月 10 日两个周六算成休息;本工具用两份独立名单分别处理,互不干扰。
四是给出拆解明细而不是一个总数。区间里到底有几天是周末休息、几天是节假日、几天是补班,结果卡和提示区都会分开列,核对时能一眼看出差额来自哪一栏。
本页不做这些事:不判断某一个日期是不是农历节日(名单要你自己维护)、不按时区换算到秒、不处理半天调休与弹性工时。要算两个日期的年月天跨度请用「日期差值计算器」,要看某个日期属于第几周请用「周数字计算器」。
计算原理:getUTCDay、逐日枚举与两张名单
整个算法只有一句话:从起始日往后一天一天走,每天判定一次「算不算工作日」,数够 N 个就停。判定用的是 Date.prototype.getUTCDay(),它返回 0(周日)到 6(周六),所以「是否周末」就是 w === 0 || w === 6 这一个布尔表达式。
为什么逐日枚举而不是 天数 × 5 ÷ 7。估算式隐含两个假设:区间内每个星期几出现次数相同、没有节假日和补班。两个假设都不成立。示例区间 2026-09-28 → 2026-10-10 一共 12 个日历天,12 × 5 ÷ 7 = 8.57,四舍五入得 9 天,可实际只有 5 个工作日——因为中间夹着国庆 7 天假。逐日枚举的计算量是 O(n),n 最多 36500 天,任何浏览器都在毫秒级跑完,没有理由为了省这点开销去换一个会错的答案。
两张名单的优先级是这个工作日计算器的核心口径。判定顺序是:① 日期在「调休补班日」名单里 → 算工作日(哪怕它是周六周日);② 日期在「法定节假日」名单里 → 不算工作日(哪怕它是周一);③ 其余按 0 和 6 判周末。补班优先于节假日,是为了处理极少数「某天既被列为放假又被安排上班」的冲突写法;本页的名单里不会出现这种情况,但规则先定死,结果才可复现。三栏互斥,所以「日历天数 = 工作日 + 周末休息 + 节假日」这条恒等式在每一行都成立。
名单为什么交给用户维护,而不是内置一份全国口径。因为放假安排每年由国务院办公厅单独发文,年份一换就作废,而且不同地区、不同单位还有自己的安排。本页把 2026 年的安排作为默认值填进去(方便开箱即用),但把它当输入而不是硬编码:改一行文本就能算别的年份,也不会因为内置数据过期而给出看似权威的错误答案。默认名单里还支持 2026-10-01~2026-10-07 的区间简写,解析时会展开成逐天。
判定用的是 UTC 字段而不是本地字段,这一点不能改。如果换成 getDay(),浏览器会先按本机时区把时间值换算成本地时间再取星期。日期框给出的 2026-09-28 在解析后是 UTC 零点,在 UTC+8 的浏览器里本地时间也是 9 月 28 日,没问题;但在 UTC−5 的时区会变成 9 月 27 日 19:00,取到的是星期日的 0 而不是星期一的 1,整个结果整体错一天。本页的算法只读 UTC 字段,任何时区结果都一致。
完整示例(数字由页面算法实算)
示例条件就是页面打开时的默认值:起始日期 2026-09-28、工作日个数 5、结束日期 2026-10-10,节假日与补班日名单为 2026 年全年安排。逐项实测如下:
- 正向:第 5 个工作日 = 2026-10-10(周六,调休补班日)。逐日走一遍是:9-29(周二)第 1 个、9-30(周三)第 2 个、10-1 至 10-7 全部跳过、10-8(周四)第 3 个、10-9(周五)第 4 个、10-10(周六,补班)第 5 个。中间整整跨越了 10 个日历日才凑够 5 个工作日。
- 如果把起始日也算作第 1 个工作日,第 5 个就落在 2026-10-09(周五),比默认口径早一天。两种写法在合同里都常见,本页按「不含起始日」计算,并在提示区写明口径。
- 反向:2026-09-28 → 2026-10-10 之间有 5 个工作日。区间共 12 个日历天,其中工作日 5 天、节假日 7 天、周末休息 0 天。正向数到第 5 个是 10-10,反向数区间也是 5 个,两个方向互相印证。
- 只排周末、完全不看名单的话是 9 个工作日,比实际多出 4 天——这 4 天就是国庆假期带来的差额。
- 用
12 × 5 ÷ 7 = 8.57估算会得到大约 9 天,比真实值多 4 天,误差率接近 80%。越是靠近长假,估算式错得越离谱。
再拿一个整年做交叉验证:按同一份 2026 年名单逐日统计,2026 年全年 365 天 = 工作日 248 天 + 周末休息 84 天 + 节假日 33 天,其中工作日 248 天里含 6 天调休补班。这个 248 与人力资源社会保障部《关于职工全年月平均工作时间和工资折算问题的通知》(人社部发〔2025〕2 号)给出的「年工作日 = 365 − 104 − 13 = 248 天」完全一致,只是拆分方式不同:官方按「休息日 104 天 + 法定节假日 13 天」写,本页按「周末实际休息 84 天 + 实际放假 33 天 − 补班 6 天」写。
输入范围与常见区间对照表
下表全部按默认的 2026 年名单计算,口径与工具一致(起始日次日算到结束日):
| 区间 | 日历天数 | 工作日 | 周末休息 | 节假日 |
|---|---|---|---|---|
| 2026-09-28 → 2026-10-10(默认) | 12 | 5 | 0 | 7 |
| 2026-09-28 → 2026-10-07 | 9 | 2 | 0 | 7 |
| 2026-10-01 → 2026-10-07(国庆假期) | 6 | 0 | 0 | 6 |
| 2026-09-25 → 2026-10-10(中秋接国庆) | 15 | 6 | 0 | 9 |
| 2026-02-15 → 2026-02-23(春节假期) | 8 | 0 | 0 | 8 |
| 2026-05-01 → 2026-05-05(劳动节假期) | 4 | 0 | 0 | 4 |
| 2026-01-01 → 2026-01-03(元旦假期) | 2 | 0 | 0 | 2 |
| 2026-09-28 → 2026-09-30 | 2 | 2 | 0 | 0 |
| 2026-07-01 → 2026-07-31(无节假日月) | 30 | 22 | 8 | 0 |
| 2026-09-01 → 2026-09-30 | 29 | 21 | 5 | 3 |
| 2026-10-01 → 2026-10-31 | 30 | 18 | 6 | 6 |
| 2025-12-31 → 2026-12-31(2026 全年) | 365 | 248 | 84 | 33 |
几行值得对照着看:法定节假日其实只有 13 天,但放假总天数是 33 天,多出来的 20 天靠调休和周末拼出来,其中又有 14 天本来就落在周六周日——所以「放假 7 天」不等于「少上 7 天班」。另外注意 2026-07-01 → 2026-07-31 这一行:这个月没有法定节假日,30 天里正好 22 个工作日加 8 天周末。
结果边界、阈值与调休口径
- 工作日个数 N 取 1~10000 的整数。下限 1 是因为「0 个工作日之后」没有意义;上限 10000 个工作日约合 40 年,从 2026-09-28 往后会落到 2065-01-30,仍在本页 1900–2100 的日期范围内。填 0、负数、小数或空值都会被拒绝并给出具体提示。
- 两份名单都可以留空。节假日名单留空 = 完全不考虑节假日,只排周末;补班名单留空 = 不把任何周末当上班。两张都留空时,得到的就是最朴素的「去掉周六周日」口径,这也是很多国外工作日计算器的唯一口径。
- 名单里的非法行会被单独列出,而不是被静默丢掉。写法支持
2026-10-01、2026-10-01~2026-10-07和逗号分隔;遇到无法识别的行,工具会指出是第几行、内容是什么,提示改成yyyy-mm-dd。 - 三栏互斥且有恒等式。「日历天数 = 工作日 + 周末休息 + 节假日」在每一行都成立。若某一天既是周六又在节假日名单里,它只记一次,归入「节假日」栏——所以会出现「周末休息 0 天」这种看着奇怪、实际正确的行(例如国庆假期那一行)。
- 法定节假日是 13 天,不是 11 天。《全国年节及纪念日放假办法》在 2024 年 11 月修订(国务院令第 795 号),自 2025 年 1 月 1 日起全体公民放假的节日由 11 天增加到 13 天:元旦 1 天、春节 4 天(含除夕)、清明 1 天、劳动节 2 天、端午 1 天、中秋 1 天、国庆 3 天。旧资料里的 11 天与「月工作日 20.83 天」都是修订前的口径。
- 月工作日与月计薪天数是两个不同的数。人社部发〔2025〕2 号给的是:年工作日 248 天、季工作日 62 天、月工作日 20.67 天(248 ÷ 12);而月计薪天数是 (365 − 104) ÷ 12 = 21.75 天,法定节假日照样计薪所以不扣。算加班费、缺勤扣款用 21.75,算综合工时是否超时用 20.67,两者不能互换。
- 历史区间要小心 1995 年 5 月 1 日这条线。中国自 1995 年 5 月 1 日起实行每周五天工作制;更早的年份里周六在很多单位是正常工作日,1994 年还实行过「单双休」。本工具一律按周六周日都是休息日处理,所以算 1995 年以前的区间时结果会比当时偏少,请自行按当年的作息修正,或把那些周六填进补班名单。
- 不处理半天假与弹性工时。名单只能按整天标注,遇上半天调休、错峰上下班、综合计算工时制,本页给出的是日历层面的工作日数,不能直接当作考勤结果。
常见问题
为什么第 5 个工作日落在星期六(2026-10-10)?
因为 10 月 10 日虽然写着星期六,但它出现在「调休补班日」名单里。国办发明电〔2025〕7 号安排 2026 年国庆 10 月 1 日至 7 日放假,9 月 20 日(周日)和 10 月 10 日(周六)上班。补班日在判定里优先级最高,所以它算工作日。要按「周末一律不上班」的简化口径,把补班名单清空再算即可。
「放假 7 天」是不是就等于少上 7 天班?
不是。以 2026 年国庆为例,10 月 1 日至 7 日放假,其中 10 月 3 日、4 日本来就是周六周日,扣掉这 2 天,实际减少的应上班日是 5 天,而 10 月 10 日的补班又补回 1 天,净减少 4 天。看放假日历和看工作日数是两回事,本页的「节假日」一栏统计的是放假日期,不区分它是否落在周末。
为什么结果里会出现「周末休息 0 天」?
因为三栏是互斥的,同一天只进一栏。2026-09-28 至 2026-10-10 这 12 天里有 10 月 3 日(周六)和 10 月 4 日(周日),但它们都在节假日名单里,按规则归入「节假日」栏,于是「周末休息」就是 0。总数仍然对:5 + 0 + 7 = 12。如果你想要「按周末归属」的统计,那是另一种口径,本页不做。
能不能算跨年的区间,比如 2026-12-20 到 2027-01-10?
可以,日期范围本身放到 2100 年。但要注意两份名单是按日期精确匹配的,2027 年的放假安排不在默认名单里,那段时间会被当成普通日子。跨年计算前,请把次年的放假日期与补班日期补进名单,否则结果只会排掉周末。
为什么不用「天数 × 5 ÷ 7」估一下就好?
因为它在长假附近会错得离谱。示例区间 12 个日历天,估算得 8.57 天、四舍五入 9 天,而实际只有 5 个工作日,多算了 4 天;整个 2026 年 10 月估算得 21.43 天,实际是 18 天。逐日枚举的开销是毫秒级的,没有理由用一个会错的近似值。
起始日本身是周末或节假日,会怎么算?
起始日只作为「出发点」,不算在 N 个工作日里;如果它是周末或节假日,就从它之后的第一个工作日开始计数。例如起始日填 2026-10-01(国庆放假第一天),第 1 个工作日会落到 2026-10-08。若你把起始日填成补班日(如 2026-10-10),第 1 个工作日则是 2026-10-12。
名单里的日期写成 2026-10-1 这种少一位的行吗?
不行,会被判定为非法行并提示行号。10-1 请补零写成 10-01,因为工具按 yyyy-mm-dd 逐字符校验,并会回读校验日期是否真实存在——2026-02-30 这类不存在的日期同样会被拦下。这样做的目的是避免「少写一位数字导致某一天被悄悄漏掉」这种最难排查的错误。
输入的两份名单会不会被上传?
不会。名单只存在于当前页面的文本框里,交给浏览器本地的判定逻辑使用,页面没有任何网络请求,也不写浏览器存储。刷新后两份名单会回到默认的 2026 年安排。想自己确认,打开开发者工具的 Network 面板点几次「计算工作日」看有没有新请求即可。