工作日计算为什么不含节假日

工具相关 ·

用工具算出一段区间有 22 个工作日,按这个数字排了工期,结果实际执行时发现根本排不下——因为中间夹了一个长假。工作日计算工具通常只做一件事:排除周六和周日。法定节假日和调休不在它的考虑范围内,这带来了两类误差。

它到底算的是什么

工作日的定义在工具里通常是:

工作日 = 日期区间内的天数 − 其中周六和周日的天数

这个定义只用了「星期几」这一个信息。它不需要知道具体的日期是哪一天,也不需要任何节假日数据。

这个设计的好处是实现简单、不需要维护年度的放假安排表。缺点是结果与实际的「上班日」有偏差。

两类误差

第一类:法定节假日被算成工作日。

春节、国庆这类长假通常包含若干工作日。比如某个区间里有 3 天法定假日落在周一到周五,那么工具会把这 3 天算成工作日,但实际是放假的。结果就是高估了可用工作日。

第二类:调休上班的周末被排除。

为了拼出连续假期,安排上通常会把某个周末调整为上班日。这些日子在工具里会被当作周末排除,但实际是要上班的。结果就是低估了可用工作日。

两类误差的方向相反,有时会部分抵消,但不会完全抵消——取决于具体区间内有多少节假日、多少调休日。

误差有多大

以春节为例。一个完整的春节假期通常包含 7 到 8 天,其中落在工作日的有 3 到 5 天。如果工期区间正好覆盖春节,那么工作日数会被高估 3 到 5 天。

对一段 30 天左右的工期来说,5 天的误差接近 17%。这个量级足以让排期明显偏乐观。

国庆假期类似。如果区间覆盖国庆,误差也是几天。

反过来,如果区间里包含调休日(比如春节前的那个周日要上班),工具会少算一天。

所以区间越长、越可能覆盖假期,误差越大。

为什么工具不内置节假日

理论上可以把每年的放假安排做成数据内置进去,让计算更准确。但这么做有几个实际问题。

数据每年都变。放假安排由官方每年年底公布,日期不固定。内置的数据需要每年更新,否则会过期。

不同地区不同。中国大陆、香港、澳门、台湾的假期安排各不相同,海外还有当地的公共假日。一套数据无法覆盖所有使用者。

业务场景不同。有些公司按国家法定假日,有些按调休后的实际安排,有些有自己的年假制度。统一的数据无法适配所有情况。

调休规则复杂。调休的具体安排也每年不同,需要精确的日期级数据,不能靠规律推算。

所以多数工具选择只做「排除周末」这一层,把节假日处理留给使用者。

该怎么做

粗略估算时,直接用工具给出的工作日数,心里清楚它可能高估或低估几天。适用于「大概要多久」这类判断。

精确排期时,把工具结果作为基数,然后人工调整:减去区间内的法定节假日天数,加上区间内的调休上班天数。

具体做法是列出区间内所有落在工作日的法定假日,数出天数;再列出区间内所有被调休为上班的周末,数出天数。用公式:

实际工作日 = 工具结果 − 法定假日(落在工作日) + 调休上班日(落在周末)

需要频繁做这类计算时,建议自己维护一张年度日期表,标注每一天是「工作日 / 周末 / 法定假日 / 调休上班」,然后用脚本查询。这张表每年更新一次,成本可控,准确性远高于通用的工作日计算。

一个容易被忽略的细节

有些区间跨越年末年初,这时需要同时参考两个年度的放假安排。比如 12 月底到 1 月初的区间,既要看今年的安排,也要看明年的安排。

另外,放假安排通常在上一年的年底才公布,所以对于未来的区间,可能暂时拿不到准确数据,只能等通知出来后再校准。

检查清单

  • 工作日计算通常只排除周六周日,不含法定节假日与调休
  • 节假日会造成高估,调休上班日会造成低估,方向相反但不会完全抵消
  • 区间越长、越可能覆盖假期,误差越大
  • 工具不内置节假日数据的原因包括数据每年变化、地区差异、业务差异
  • 精确排期时用「工具结果 − 法定假日 + 调休上班日」修正
  • 频繁计算时建议自建年度日期表,每年更新一次
阅读 12