ToolAct工具行动

工作日计算器

计算日期范围内的实际工作日数量,支持排除周末和节假日

工作日计算

什么是工作日计算器?

工作日计算器用于统计一个日期范围内真正可用的工作日数量,会按选择的周末规则和手动输入的节假日天数进行扣除。它适合项目交付预估、请假天数核对、薪资结算、账期安排、招聘流程和合同周期估算。工作日和自然日不是一回事:周六周日休息、周五周六休息、地区法定假日、公司统一休假、调休日和补班日都会影响结果。这个工具提供的是基于输入规则的快速排期估算,不会自动识别各地节假日表。用于 HR、法律、财务或正式合同场景时,应再对照官方日历和公司制度复核。

使用方法

使用方法

  1. 输入开始日期和结束日期
  2. 选择排除周末的选项(周六-周日 / 周五-周六 / 无)
  3. 输入法定节假日天数(可选)
  4. 点击「计算工作日」查看结果

日历说明

  • 计算前请先设置周末规则;周五-周六、周六-周日和无周末的设置会产生不同的结果。
  • 法定节假日和公司停工日需要单独输入才能排除。

使用场景

估算两个日期之间的实际工作产能选择包含起止的开始和结束日期,计算总天数、周末天数、手动输入的节假日天数和剩余工作日。结果适用于粗略的迭代产能估算、交付规划、入职窗口期和 SLA 讨论,在完整日历审查之前提供参考。
根据地区或团队排班调整周末规则选择周六/周日、周五/周六或不排除周末,而非假设全球统一的工作周。这让计算对分布式团队、跨境供应商和使用非标准日历的运营更有用。
校验请假、采购和交接时间线输入已知的法定节假日天数将其从工作日总数中扣除,然后将结果作为规划检查点。该工具不知道当地节假日日期、调休日、半天假或公司特定的停工安排,因此最终截止日期仍需对照官方日历。中国的排班还包括调休(将正常周末变为上班的周六或周日),这些不会被自动翻转——页面只能看到周末模式和节假日天数,因此春节调休周需要在节假日字段中手动反映或通过调整周末规则来处理。
用不同节假日天数重跑相同范围以对比方案将节假日输入从 0 切换到 5、10 或 15,重新计算以查看排期的激进或保守程度。当向对该时间段内法定假日有不同认知的利益相关者解释截止日期时,可视化差异很有帮助。对于西方日历,联邦假日清单(新年、马丁路德金日、总统日、阵亡将士纪念日、六月节、独立日、劳动节、哥伦布日/原住民日、退伍军人节、感恩节、圣诞节)每年通常贡献 10-11 个工作日,OPM 提前公布 2025-2027 年的清单,可以直接查找天数。
将工作日结果反推为日历日期将结果作为相关日期运算工具的输入,在相同的周末规则下将工作日数加到已知的开始日期上。这给出一个预计结束日期,可以直接填入 Jira、SLA 字段或招聘面试邀请中,无需重新输入周末模式。

技术原理

工作日计数是指包含起止日期的区间 `[start, end]` 内,既不是周末也不是节假日的天数。标准的包含端点公式为 `total_days = (end - start) / 86_400_000 + 1`(两个日期均归一化到 UTC 午夜),然后减去周末和节假日天数。星期几通过 `Date.prototype.getDay()` 获取,返回 `0`(周日)到 `6`(周六)——注意一个常见陷阱:`getDay()` 不是 `getDate()`,且结果基于浏览器本地时区,因此跨越午夜的 UTC 日期字符串可能落在与预期不同的星期几上。 周末模式因地区而异:全球默认为周六-周日(西方国家、印度、亚洲大部分地区),但中东历史上使用周四-周五,截至 2024 年大多数海湾国家(阿联酋、巴林、科威特、卡塔尔)已调整为周五-周六或周六-周日(周五半天)。伊朗、阿富汗和南亚部分地区仍仅休周五;以色列休周五-周六。工具提供周六-周日、周五-周六和「无」三种常见预设,其余情况通过节假日天数减法来覆盖。 计数算法本身有两种实用实现方式。朴素迭代法逐日遍历:`for (let d = start; d <= end; d.setDate(d.getDate()+1)) if (![0,6].includes(d.getDay())) count++`,时间复杂度 O(n)(n 为日历天数),代码直观易读。闭合形式的替代方案计算 `full_weeks * 5 + partial_week_workdays`,时间复杂度 O(1),在跨越多年的时间范围中更有优势。落在周末的节假日不应被重复扣除,因此标准做法是用 `holidays.filter(h => !isWeekend(h)).length` 过滤节假日集合。中国的调休政策增加了一个纯周末模式无法处理的特殊情况:国务院每年发布调休安排,将特定的周六或周日调整为工作日,以补偿春节或国庆的延长假期,因此中国日历的节假日列表必须配合明确的「补班日」列表,而不能仅依赖星期几规则。

  • 包含端点公式:`total_days = (end - start) / 86_400_000 + 1`,两个日期均归一化到 UTC 午夜以避免夏令时偏移。
  • `Date.prototype.getDay()` 返回 0(周日)到 6(周六),基于浏览器本地时区而非 UTC——时区敏感的代码应使用 `getUTCDay()`。
  • 周末预设:周六-周日(西方、印度、亚洲大部分地区)、周五-周六(2006-2013 年起的大多数海湾国家)、仅周五(伊朗)、无(全天候运营)。
  • O(1) 闭合形式:`full_weeks * 5 + extra_workdays_in_partial_week`;在跨越多年的时间范围中优于逐日迭代。
  • 落在周末的节假日不得重复扣除:应减去 `holidays.filter(h => !isWeekend(h)).length`,而非原始节假日天数。
  • 中国国务院调休:某些周六/周日成为法定工作日以补偿延长假期;需要配合明确的补班日列表。
  • 美国联邦假日(依据 5 U.S.C. § 6103)每年贡献 11 个工作日:新年、马丁路德金日、总统日、阵亡将士纪念日、六月节、独立日、劳动节、哥伦布日、退伍军人节、感恩节、圣诞节。

示例

2026 全年工作日

起始日期:2026-01-01
结束日期:2026-12-31
周末:    周六 & 周日
节假日:  13  (中国法定节假日,含调休后)

总天数:    365
周末天数:  104
节假日:    13
工作日:    248

两周冲刺(Sprint)容量

起始日期:2026-06-15(周一)
结束日期:2026-06-26(周五)
周末:    周六 & 周日
节假日:  0

总天数:    12
周末天数:  2
工作日:    10  (完整两周冲刺,4 名开发 => 40 人日容量)

中东团队(周五-周六为周末)

起始日期:2026-09-01
结束日期:2026-09-30
周末:    周五 & 周六
节假日:  1  (地区性节假日)

总天数:    30
周末天数:  8   (9 月的周五 + 周六)
工作日:    21

节后入职窗口期

起始日期:2026-10-08  (黄金周后第一个工作日)
结束日期:2026-10-30
周末:    周六 & 周日
节假日:  0

总天数:    23
周末天数:  6
工作日:    17  (足够安排 3 周的入职计划)

2027 Q1 规划(含美国联邦节假日)

起始日期:2027-01-01
结束日期:2027-03-31
周末:    周六 & 周日
节假日:  4  (元旦、马丁·路德·金日、总统日、耶稣受难日)

总天数:    90
周末天数:  26
工作日:    60

常见问题

工作日是如何计算的?

默认计入周一至周五,周六、周日跳过。你在节假日列表中指定的日期也会被排除。页面会显示总日历天数、周末天数、节假日天数以及最终的工作日数量。

会自动应用法定节假日吗?

不会。计算器不会自动加载法定节假日,你需要手动输入节假日数量。请参考所在国家或地区的官方日历来填写准确数值。

支持调休吗?

不支持。计算器仅排除周末和你输入的节假日数量,不会自动处理中国的调休安排或类似政策。如果你的日程包含调休补班,请手动调整周末规则或节假日数量。

可以只排除周末,不排除节假日吗?

可以。关闭节假日列表后,计算只会排除周六和周日。你还可以自定义哪几天算作周末——例如部分中东地区采用周五至周六作为周末。

本工具与「日期差计算」工具有什么区别?

「日期差计算」返回的是日历天数,本工具返回的是工作日数,会跳过周末和节假日。前者适合用来计算实际经过时间,本工具更适合项目截止日、合同日期、SLA 时间窗等场景。

可以计算过去的日期吗?

可以。本工具支持任意两个日期之间的工作日计算,无论过去还是未来。输入起止日期、选择周末规则、填写节假日数量,页面即可得出该范围内的总工作日。

我的数据会被上传吗?

不会。计算在你的浏览器中完成,节假日数量和日期都不会被保存或上传。