工作日计算器
计算日期范围内的实际工作日数量,支持排除周末和节假日
工作日计算
什么是工作日计算器?
工作日计算器用于统计一个日期范围内真正可用的工作日数量,会按选择的周末规则和手动输入的节假日天数进行扣除。它适合项目交付预估、请假天数核对、薪资结算、账期安排、招聘流程和合同周期估算。工作日和自然日不是一回事:周六周日休息、周五周六休息、地区法定假日、公司统一休假、调休日和补班日都会影响结果。这个工具提供的是基于输入规则的快速排期估算,不会自动识别各地节假日表。用于 HR、法律、财务或正式合同场景时,应再对照官方日历和公司制度复核。
使用方法
使用方法
- 输入开始日期和结束日期
- 选择排除周末的选项(周六-周日 / 周五-周六 / 无)
- 输入法定节假日天数(可选)
- 点击「计算工作日」查看结果
日历说明
- 计算前请先设置周末规则;周五-周六、周六-周日和无周末的设置会产生不同的结果。
- 法定节假日和公司停工日需要单独输入才能排除。
使用场景
技术原理
工作日计数是指包含起止日期的区间 `[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 时间窗等场景。
可以计算过去的日期吗?
可以。本工具支持任意两个日期之间的工作日计算,无论过去还是未来。输入起止日期、选择周末规则、填写节假日数量,页面即可得出该范围内的总工作日。
我的数据会被上传吗?
不会。计算在你的浏览器中完成,节假日数量和日期都不会被保存或上传。