工作日计算
起始日期
结束日期
起始日±N 工作日/区间内工作日数
起始日期
结束日期
了解工具定位 · 使用场景 · 对比优势
根据起始日期和指定工作日数(±N)计算目标日期,或统计两个日期之间的工作日总数。HR 排考勤、项目经理定交付节点、财务算对账截止日,不用再手动翻日历数周末。输入日期和天数,结果即时显示。所有计算在浏览器本地完成,日期数据不上传服务器。
项目经理定下 10 月 15 日交付,需提前 15 个工作日完成内部测试。手动数日历容易漏掉周末和法定假日,本工具输入截止日与工作日数,自动跳过节假日,精确输出最晚启动日期,避免排期偏差导致延期。
采购合同约定“收到发票后 30 个工作日内付款”,财务人员需根据发票日期推算付款截止日。本工具排除周末与法定节假日,直接给出准确日期,避免因算错天数产生逾期违约金或信用扣分。
HR 统计员工 3 月 1 日至 3 月 15 日的请假天数,需扣除中间的周末和清明假期。手动逐日核对效率低且易错,本工具输入起止日期,自动计算出区间内的纯工作日数,直接用于考勤核算。
理财产品赎回规则为“T+5 个工作日”,用户 4 月 20 日提交赎回申请,需知道资金最晚到账日。本工具输入起始日与工作日数,自动跳过五一假期,给出资金可用日期,方便安排后续资金周转。
律师收到法院传票,应诉期限为“送达后 15 个工作日内”。手动推算时容易忽略国庆长假导致逾期,本工具输入送达日期与工作日数,自动排除法定节假日,输出准确的截止日期,确保不超期。
| 维度 | 本工具 | 工作日计算器 (timeanddate.com) | Excel NETWORKDAYS |
|---|---|---|---|
| 数据隐私 | 纯浏览器,零上传 | 上传到服务器计算 | 数据存储在本地文件 |
| 处理速度 | 1 秒内 | 1-3 秒(含网络延迟) | 即时(需手动输入公式) |
| 离线可用 | 完全离线 | 需联网 | 完全离线 |
| 节假日处理 | 需手动输入/选择 | 内置全球节假日数据库 | 需手动配置节假日列表 |
| 操作复杂度 | 输入日期和天数即可 | 需选择时区、日历等选项 | 需编写 NETWORKDAYS 公式 |
| 平台依赖 | 任何浏览器 | 浏览器 | 需安装 Microsoft Excel 或兼容软件 |
| 结果导出 | 手动复制 | 可分享链接 | 可保存为文件 |
上手步骤 · 输入输出 · 避坑提示
| 输入 | 输出 | 说明 |
|---|---|---|
| 2024-01-01, +5 工作日 | 2024-01-08 | 典型场景:从元旦起算 5 个工作日 |
| 2024-01-01 至 2024-01-31 | 23 个工作日 | 典型场景:计算整月内的工作日数 |
| 2024-02-09, -1 工作日 | 2024-02-08 | 边界 case:跨周末向前推算 |
| 2024-10-01 至 2024-10-07 | 0 个工作日 | 边界 case:国庆长假全部为法定假日 |
| 2024-01-01, +0 工作日 | 2024-01-01 | 边界 case:N=0 时返回起始日自身 |
| 2024-12-31, +1 工作日 | 2025-01-02 | 易错 case:跨年时自动跳过元旦假日 |
| 2024-02-29, +1 工作日 | 2024-03-01 | 易错 case:闰年 2 月 29 日后的工作日计算 |
输入「2025-03-01 到 2025-03-10」想算工作日,结果直接用了自然日天数 10 天在工具中输入起止日期「2025-03-01」和「2025-03-10」,选择“区间内工作日数”功能,得到实际结果(如 7 天)自然日包含周末和法定节假日,工作日只算周一至周五且排除法定假;两者差距可达 30%-40%,合同/考勤场景必须区分
输入「2025-03-03(周一)」+ 3 工作日,期望得到 2025-03-06(周四),实际得到 2025-03-05(周三)确认工具规则:起始日当天不计入偏移。若需包含当天,手动将起始日设为前一天(如 2025-03-02 周日 + 3 工作日 → 周三)不同工具对“当天是否算第 1 天”实现不同;本工具采用“起始日 + N 个完整工作日”的偏移逻辑,当天不计入
2025 年春节调休(1 月 28-31 日放假,2 月 1-2 日补班),输入 1 月 27 日 + 5 工作日,期望 2 月 3 日,实际得到 2 月 4 日检查工具是否已加载 2025 年国务院放假安排;若未更新,手动将调休日(如 2 月 1-2 日)标记为工作日,放假日期标记为休息日法定节假日每年由国务院公布,工具需同步更新;2025 年春节调休导致 2 月 1-2 日(周六日)上班,若工具未更新会多算休息日
输入「2024-02-28」+ 2 工作日,期望 2024-03-01(周四),但工具按非闰年 2 月 28 天计算,得到 2024-03-02确认工具内置了闰年判断(能被 4 整除且不被 100 整除,或能被 400 整除);2024 年是闰年,2 月有 29 天,结果应为 3 月 1 日公历闰年规则:世纪年(如 1900、2100)不是闰年,除非能被 400 整除(如 2000);2 月天数错误会导致后续日期偏移
想算 2025-03-10 前 5 个工作日,输入「2025-03-10」+ -5,得到 2025-03-03(周一),但实际应为 2025-03-04(周二)输入「2025-03-10」+ -5,确认工具规则:负偏移从起始日当天往前推 N 个工作日(不含起始日当天);若需包含当天,起始日改为 2025-03-11负偏移逻辑与正偏移对称:起始日当天不计入偏移;往前推 5 个工作日 = 从 3 月 10 日(周一)往前数 5 个工作日 → 3 月 4 日(周二)
输入结束日期「2025-03-01」和开始日期「2025-03-10」,工具返回负数或报错始终将开始日期填在第一个输入框,结束日期填在第二个;若工具支持自动交换,检查是否有“自动排序”选项区间计算依赖日期先后顺序;颠倒后工具可能无法正确识别区间,或返回负值(如 -7 天),需手动交换或启用自动排序
输入「03/01/2025」期望 3 月 1 日,但工具按 DD/MM/YYYY 解析为 1 月 3 日使用 ISO 8601 格式「YYYY-MM-DD」(如 2025-03-01),或查看工具支持的日期格式列表不同地区日期格式歧义(MM/DD vs DD/MM);ISO 8601 是国际标准,无歧义,且大多数编程语言原生支持解析
用户在北京时间 2025-03-01 23:00 输入,工具按 UTC 时间处理,将日期识别为 2025-03-01 或 2025-03-02 不确定确认工具使用本地时区(浏览器时区)还是 UTC;若为 UTC,在 UTC 时间 16:00 前输入可避免日期漂移纯前端工具(FE)通常使用浏览器时区;后端工具(BE)可能使用 UTC;时区差异会导致跨日边界时结果偏差一天
公式推导 · 流程图解 · 依据出处
W = f(S, E, N, C)
S — 起始日期E — 结束日期(区间模式)N — 工作日偏移量(±整数)C — 工作日历配置(含法定假日、调休)W — 计算结果:日期或工作日数起始日 2025-01-01,向后推 5 个工作日。S=2025-01-01,N=+5,C=中国法定假日(元旦 1 月 1 日放假)。跳过 1 月 1 日(假日)、1 月 4-5 日(周末),第 5 个工作日为 2025-01-09。结果 W=2025-01-09。
适用于中国法定工作日历(含国务院调休安排)。不适用于无固定假日制度的国家或自定义排班场景。数据来源:国务院办公厅每年发布的节假日安排通知。
3 种主流语言 · 复制即用
from datetime import datetime, timedelta
# 计算起始日 +N 个工作日(跳过周六日)
start = datetime(2025, 3, 1) # 周六
n = 3
count = 0
current = start
while count < n:
current += timedelta(days=1)
if current.weekday() < 5: # 周一=0,周日=6
count += 1
print(f"{start.date()} + {n} 工作日 = {current.date()}") # 2025-03-05(周三)
# 计算区间内工作日数(含起止日)
start = datetime(2025, 3, 3) # 周一
end = datetime(2025, 3, 7) # 周五
workdays = sum(1 for i in range((end - start).days + 1)
if (start + timedelta(days=i)).weekday() < 5)
print(f"{start.date()} 到 {end.date()} 共 {workdays} 个工作日") # 5package main
import (
"fmt"
"time"
)
func main() {
// 计算起始日 +N 个工作日
start := time.Date(2025, 3, 1, 0, 0, 0, 0, time.UTC) // 周六
n := 3
count := 0
current := start
for count < n {
current = current.Add(24 * time.Hour)
if current.Weekday() != time.Saturday && current.Weekday() != time.Sunday {
count++
}
}
fmt.Printf("%s + %d 工作日 = %s\n", start.Format("2006-01-02"), n, current.Format("2006-01-02")) // 2025-03-05
// 计算区间内工作日数(含起止日)
start = time.Date(2025, 3, 3, 0, 0, 0, 0, time.UTC) // 周一
end := time.Date(2025, 3, 7, 0, 0, 0, 0, time.UTC) // 周五
workdays := 0
for d := start; !d.After(end); d = d.Add(24 * time.Hour) {
if d.Weekday() != time.Saturday && d.Weekday() != time.Sunday {
workdays++
}
}
fmt.Printf("%s 到 %s 共 %d 个工作日\n", start.Format("2006-01-02"), end.Format("2006-01-02"), workdays) // 5
}// 计算起始日 +N 个工作日
function addWorkdays(startDate, n) {
let count = 0;
let current = new Date(startDate);
while (count < n) {
current.setDate(current.getDate() + 1);
const day = current.getDay(); // 0=周日, 6=周六
if (day !== 0 && day !== 6) count++;
}
return current;
}
const start = new Date('2025-03-01'); // 周六
const result = addWorkdays(start, 3);
console.log(`${start.toISOString().slice(0,10)} + 3 工作日 = ${result.toISOString().slice(0,10)}`); // 2025-03-05
// 计算区间内工作日数(含起止日)
function countWorkdays(startDate, endDate) {
let workdays = 0;
const current = new Date(startDate);
while (current <= endDate) {
const day = current.getDay();
if (day !== 0 && day !== 6) workdays++;
current.setDate(current.getDate() + 1);
}
return workdays;
}
const start2 = new Date('2025-03-03'); // 周一
const end2 = new Date('2025-03-07'); // 周五
console.log(`${start2.toISOString().slice(0,10)} 到 ${end2.toISOString().slice(0,10)} 共 ${countWorkdays(start2, end2)} 个工作日`); // 58 个高频疑问