在线工作日计算器:算两个日期之间有几个工作日、几个休息日,往后或往前数 N 个工作日看落在哪一天,一次列出一整年 12 个月各有多少工作日,还能翻一张点得动的工作日历。法定节假日与调休默认已经扣除,数据每天自动同步,依据国务院办公厅历年通知;工作制可选双休、单休、大小周或自定义上班日,公司另放的假、另补的班还能自己填。全部按公历年月日整数运算。
每个月的工作日天数
每个月单独一页:这个月有几个工作日、怎么算出来的、哪几天放假、哪几天补班。
怎么用
这一页把「工作日」这件事拆成了四个页签,最上面一条常驻的工作制与法定节假日开关对四个页签同时生效。填完就出结果,不用点确认;上次用的页签、工作制、开关状态和填过的日期会记在你这台设备的浏览器里。
法定节假日与调休:默认已经算进去了
页面打开时会取一次法定节假日数据,取到之后工作制那一块会写明最近一次同步的日期,并列出通知原文链接,你可以点进去核对。数据由后台每天自动同步,依据国务院办公厅历年通知(经开源项目 holiday-cn 整理),本页不手写任何日期。
- 「扣除法定节假日与调休」开关默认打开:放假那几天不算工作日,调休补班的周末算工作日。
- 想要一份不受假期影响的基线(比如按纯星期排的产能计划),把开关关掉,四个页签立刻退回只按工作制算。
- 网络不通或数据没取到时,页面会直接说「没取到法定节假日数据,只按工作制算」,不会假装算准了。
- 某一年还没有数据(下一年的安排通常要到前一年年底前后才公布)时,结果旁会标一句「其中某年的放假安排还没有数据,这一段只按工作制算」。
先把工作制选对
默认是双休(周一到周五上班)。下拉还有三种:
- 单休:周一到周六上班,只休周日;
- 大小周:周一到周五照常,周六隔周上一次。选这项会多出一个日期框,挑一个属于「小周」(要上班的那个周六)的日子,页面以它所在那一周为基准隔周推,周日始终休息;
- 自定义:自己勾周一到周日哪几天上班。四天工作制、三班倒的行政班、周末营业的门店都靠它。
工作制底下那行小字会实时写出当前口径,比如「自定义(上班:周一、周三、周五);已扣除法定节假日与调休」,一眼能确认没选错。
一、两个日期之间有几个工作日
填起始日期与结束日期(默认本月 1 日到本月最后一天),结果给一组数:
- 工作日 N 天——大字,最常要的那个;
- 休息日、总天数——三者相加对得上;
- 按工作制本来几天要上班——所有加减的基数;
- 被法定节假日扣掉 N 天、法定调休补班加回 N 天;
- 被我的节假日扣掉 N 天、被我的调休上班加回 N 天。
后面四个数与基数的加减关系是严格对得上的:基数 − 法定扣 + 法定补 − 自己扣 + 自己补 = 工作日。
「含起始当天」「含结束当天」两个开关默认都勾上,也就是「这段日子一共占了几个工作日」的口径。快捷按钮有本月、下月、本季度、今年。
二、往后/往前数 N 个工作日
填基准日期、个数(1 到 2000),选往后还是往前,结果给出落点日期、星期几、合多少个自然日、这中间休息了几天。法定假期会被自动跳过,法定补班的周末算作工作日。常用档位 3、5、7、10、15、30 各有一个按钮。
「当天算第 1 天」这个开关默认不勾:从基准日的下一天起数,这是「三个工作日内回复」最常见的数法。
三、每月工作日一览
选年份(默认今年,上下各一个翻年按钮),出一张 12 行的表:月份、自然日、按工作制、休息日、实际工作日。当前月份那一行高亮,表尾是全年合计。「复制表格」把整张表复制成制表符分隔的文本。年份范围 1900 到 2100,其中有法定数据的年份才会给出「实际工作日」。
四、工作日历
选年月,画一张周一开头的月历,六种身份各有底色:工作日、休息日、法定放假、法定调休上班、我的节假日、我的调休上班;法定的那两种格子里带节日名,鼠标悬停能看到完整信息。今天那一格有一圈描边。点某一天,它会在「跟着工作制 → 我的节假日 → 我的调休上班 → 跟着工作制」之间轮换——这等于往下面两张表里加减,改完四个页签的结果一起变。
公司另外放的假 / 另外补的班
页面最下面常驻两个文本框,填法定表里没有的那些:年会、厂休、班组轮休、项目赶工补的班。一行一个日期,格式是 2026-01-02;连着几天写成 2026-01-02~2026-01-05(只是举例说明写法)。填完点「应用这两张表」,读不出来的行会被跳过并告诉你跳了几行。「导出文本」把两张表复制出来备份或换台设备粘回去,「清空」会先弹一次确认。
怎么看结果
五层优先级,从下往上盖
同一天可能同时被好几条规则说中,本页的优先级是固定的,从低到高:
- 工作制(比如周一到周五上班);
- 法定放假——盖掉工作制,那天不上班;
- 法定调休上班——盖掉前两层,那个周末要上班;
- 我的节假日——你们公司另外放的假,盖掉法定;
- 我的调休上班——最高,说了上班就是上班。
所以「法定放假那天我们公司照常加班」这种情况,把那天填进「我的调休上班」就对了。
那几行加减量怎么读
结果卡里的四个增减量是逐层相对下一层算出来的,这样才能保证不重复扣:
- 被法定节假日扣掉只数「本来按工作制要上班、被法定放假变成休息」的天。假期里本来就是周末的那几天不会被重复扣——很多人手工数的时候直接把整段假期天数减掉,结果少算好几天工作日。
- 法定调休补班加回只数「本来该休息、被调休变成上班」的天,典型就是那种被调成上班的周六。
- 被我的节假日扣掉是在法定那一层算完之后再看的:如果你填的那天本来就是法定假期,它不会再扣一次。
- 被我的调休上班加回同理。
起止两天算不算,差的不止一天
同一对日期,开关不同结果能差两天。判断方法只有一句话:问自己起始那天和结束那天,是不是也要出工。
- 两头都含(默认)=这段日子一共占了几个工作日。排工期、排班表、算请假条上的天数用这个。
- 不含起始当天=从明天开始算。签收之后「N 个工作日内处理」常用这一种。
- 不含结束当天=算到截止日的前一天为止,也就是「必须在那天之前做完」。
结果卡里那行「总天数 N 天(含起始当天、含结束当天)」把当前口径直接写在脸上,免得复制走之后忘了勾的是哪一套。
「N 个工作日内」的两种数法
第二个页签的「当天算第 1 天」开关不是小节:
- 不勾(默认):周四提交、3 个工作日,正常情况下落在下周二。数的是周五、周一、周二。
- 勾上:周四本身算第 1 天,落点提前一天。
现实里两种都有人用,而且很多机构说的「三个工作日」其实是「不超过三个工作日」,还有的从受理日而不是提交日起算。碰上长假,实际等待可能远超三天——这也正是本页把法定假期算进去的意义:结果直接给你一个能写进邮件的日期,不用自己数着日历跳过假期。
「某月工作日多少天」的答案在哪一列
每月一览表里,「按工作制」只数星期,「实际工作日」才是扣掉法定节假日、加上调休补班之后的数。搜索「某月工作日」想知道的通常是后者:那一列直接就是那个月要上班的天数。
两列分开列是有意的:前一列是不会变的事实(某年某月按周一到周五有几天),后一列取决于当年的放假安排与你自己的补充。对外发排期时,把口径一起写上,比只发一个数字省去很多来回。
双休制下每月按工作制一般是 19 到 23 天,全年 261 或 262 天,这两个数只由「1 月 1 日是星期几」和「闰不闰年」决定;扣掉法定假期之后,各月的实际工作日会明显被拉开,有长假的那几个月最少。
日历上的六种底色
工作日、休息日由工作制决定;法定放假与法定调休上班来自同步下来的数据,格子里带节日名;我的节假日与我的调休上班是你自己点出来的。点错了再点一下继续轮换就能回到原样。想快速录入一整段,用下面的文本框写区间更快;想零星调几天,在日历上点更直观。
常见问题
这页和日期计算器、倒数日有什么不一样?
日期计算器管的是自然日:两个日期差多少天、几周零几天、几年几个月几天、某天是星期几,工作日在那边只是一个附带读数,而且只按周一到周五算。这一页把工作日做深:四种工作制、法定节假日与调休、公司自己的假期、每月一览、能点的工作日历。要盯着一个未来日期一天天倒数,用倒数日;要按时长倒计时并到点提醒,用在线倒计时;要看国外同事那边现在几点、差几个小时,用世界时钟。
法定节假日数据从哪来?多久更新一次?
来自国务院办公厅每年公布的放假安排通知,由开源项目 holiday-cn 对着官方原文整理成结构化数据,本站后台每天定时同步一次,页面从本站自己的接口读取。页面上会写明最近同步的日期,并把对应年份的通知原文链接列出来,点进去就能核对。本页不手写任何日期——这是刻意的:手写的表迟早会在某一年过期,而且过期了不会报错。
数据同步出问题会怎样?
不会给你一个错的答案。后台那边有几条护栏:拉到空数据绝不覆盖已有的年份,校验不过就整年丢弃保留旧值,上游全挂就什么都不动。页面这边取不到数据时,会直接在界面上说明并退回只按工作制算。你看到的要么是有出处、有同步日期的结果,要么是明确标注「只按周一到周五」的结果,不存在中间态。
能不能查农历和节气?
不能,本页只算公历,也不做农历。法定假期里那些按农历定的节日,同步下来的数据已经换算成了具体日期,所以不影响工作日计算。
我填的假期会传到服务器上吗?换台电脑还在吗?
不会传。两张表存在你当前这台设备的浏览器本地存储里(键名 hi8-gongzuori-holidays),工作制、法定开关与上次用的页签存在 hi8-gongzuori-prefs。页面只会向本站的法定节假日接口取一次数据,不会把你填的任何东西发出去。换设备、换浏览器或清理浏览数据之后就会回到默认值——录完之后建议点一下「导出文本」留个备份。
支持多大的年份范围?
日期计算支持 1900 年到 2100 年,超出范围会明确提示算不了。法定节假日数据只覆盖已经公布过安排的那些年份,其余年份自动退回按工作制算并在界面上标明。
算出来的天数会不会因为时区或夏令时差一天?
不会。页面把每个日期先换成一个整数——距 1970 年 1 月 1 日的天数——再做加减,全程不碰时分秒。常见的错误做法是拿两个时间戳相减再除以一天的毫秒数,在实行夏令时的地区,切换那一天只有 23 小时或有 25 小时,除下来就会少一天或多一天。本页从根上避开了这个坑。
原理与冷知识
先换成整数,再做加减。严肃的日期计算从不直接对「年月日」做加减,而是先把日期换成一个连续的天序号(编程里常用「距 1970 年 1 月 1 日的天数」),加减完再换回来。原因是年月日不是均匀的进位系统:月有 28 到 31 天四种长度,年有 365 或 366 天两种,规则还随世纪年变化。换成整数之后,「相差多少天」就是一次减法,闰年与月长全被换算函数吸收掉,不可能在半路算漏。本页的每一个读数都建立在这个整数之上;法定假期那两张表也是先换成同一种整数再做集合查询的,所以跨年、跨月都不会错位。
任意连续七天里正好五个工作日——这条性质很好用。双休制下,只要区间长度是 7 的倍数,按工作制算的工作日数就是天数除以 7 再乘 5。这条性质也解释了为什么按工作制算的全年工作日只有 261 和 262 两种:365 天=52 周零 1 天,多出来的那一天是工作日就 261 天,闰年多两天,两天都是工作日就 262 天。扣掉法定假期之后这个数才会真正拉开差距,而具体差多少每年都不一样——这正是它必须靠数据、不能靠公式的原因。
调休是个挺特别的制度。把前后的周末挪过来拼出一个长假,是中文语境里独有的安排方式,很多日期库、很多国外的工作日计算器根本没有「把周六变成工作日」这个概念,它们的假期表只能做减法。本页把它做成了和放假对等的一层:法定调休上班会把一个本该休息的日子变成工作日,所以你会看到「法定扣掉 3 天、补班加回 1 天」这样的结果——这两个数分开列,就是为了让长假前后那几周的排期一眼看明白。
每月工作日为什么在 19 到 23 之间摆动。28 天的平年 2 月正好是四整周,无论从星期几开始,按工作制都是 20 个工作日。31 天的月份=四周零三天,如果这三天全落在工作日就是 23 天,全撞上周末则是 21 天。所以「这个月特别忙」的感觉往往是真的,它和放假无关,只和 1 号是星期几有关。
大小周的隔周是怎么算的。本页把你指定的那一天归到它所在那一周的周一,再看目标日期所在周的周一与它差几周:差偶数周就上班,奇数周就休息。用「周一」而不是「周六」当基准是为了避免跨年、跨月时的歧义——一周从哪天开始,不同的人默认不一样,先归一化成同一个锚点,往前往后推都不会错位。
「N 个工作日」是个合同用语,不是数学定义。它至少有四个自由度:从哪天起算(提交日还是受理日)、当天算不算、周末算不算、法定假期算不算。四个自由度乘起来,同一句「五个工作日内」在两边心里可能差出一整周。写合同、写 SLA、写交付承诺时,最省事的做法是直接写死一个日期,或者把口径一句话写清楚:「自受理次日起算五个工作日,遇法定节假日顺延」。本页那两个开关的存在,就是为了让你能把对方的口径原样复现一遍。
各国的工作周并不一样。周六周日休息在今天看来天经地义,但它是工业化之后才逐渐固定下来的安排;中东一些国家的周末是周五和周六,还有不少地方在推行四天工作制。这也是本页把「自定义」做成勾选周一到周日的原因——工作制是一个本地约定,不该被写死在工具里。
为什么假期数据必须「每天拉一次」而不是「写进代码」。写死的表在发布那天是对的,第二年就可能错,而用户没有任何办法发现:页面照样给出一个整齐的数字,只是那个数字不再成立。改成每天同步之后,问题从「会不会过期」变成了「同步失败怎么办」——后者是能设计的:拉到空数据不覆盖旧值、校验不过整年丢弃、上游全挂就什么都不动、页面取不到就明说只按工作制算。工具类页面真正的可靠性,不在于功能多,而在于它对自己不知道的事情是否诚实。