使用方法
- 起始日期服务端直出为 2026-10-10(周六),即使脚本尚未执行,输入框也不是空白。
- 天数默认 30。正数表示从起始日往前推,负数表示反向往后推;填 0 则返回起始日本身。
- 自然日模式逐日计算,周六周日也计入;工作日模式只在经过周一至周五时扣减天数。
- 按回车或点「计算目标日期」,结果会同时给出日期、星期、方向与自然日跨度。下方对照表可按 TSV 复制。
- 工作日模式不含法定节假日。中国法定节假日每年由国务院公布,不能仅凭星期公式推导。
这个日期减天数计算器能解决什么问题
本页解决的是「已知一个日期,往前推 N 天是哪一天」:例如合同截止日前倒排准备期、账期向前找起算日、排期表按工作日回退、从纪念日倒推提醒日期。它只需要一个起始日期与一个天数,不要求用户再填第二个日期,因此不承担「两个日期之间相差多少天」的任务。
旧目录中曾把本页写成“Subtract天日期计算器”,这里统一改为日期减天数计算器。运算结果把方向明示出来:正数向前推,负数向后推;这样既保留「减天数」的主语义,也能处理反向校验,而不会把负号静默归零。
真实用途集中在「条款写了天数,要找出对应的那一天」:合同约定「交付日前 30 日完成备货」,就用交付日减 30 个自然日倒排生产;保修凭证写「自开具之日起若干日内有效」,可用开票日往前推起算日核对是否仍在期内;诉讼时效、异议期、撤销权行使期这类以「知道或应当知道之日起若干日」表述的期间,同样可以用条款载明的天数回推届满日。账期与对账日也常这样反查:已知付款日,倒推记账与对账的起算日,避免口头估算造成的错期。
计算原理与变量说明
自然日模式先把年月日送入 Date.UTC,得到不依赖本地时区的 UTC 日期,再用 setUTCDate 在 UTC 日历上减去天数,最终用 getUTCFullYear、getUTCMonth、getUTCDate 与 getUTCDay 读取结果。全程不混用本地时区方法,避免夏令时切换时出现多一天或少一天。
为什么必须用 UTC,可以用一个反例说明:在实行夏令时的地区,春季会把时钟拨快一小时,秋季拨回一小时,这两天分别只有 23 小时与 25 小时。若把日期换算成「本地午夜 + 毫秒差」再除回天数,一旦运算区间跨过切换日,就可能出现少算或多算一天的结果;把同一个日期交给不同时区的设备计算,答案还会互相打架。改用 Date.UTC 构造、setUTCDate 回退、getUTCDay 判星期之后,每天始终是完整的 86400000 毫秒,闰秒与本地偏移都不参与运算,同一输入在任何设备上都得到同一个日期,也仍能得到 2026-03-01 减 1 天为 2026-02-28 这类正确结果。
跨月不需要自己算每月天数。setUTCDate 接收的日期允许超出当月范围,日期对象会自动向月份借位:2026-03-01 减 1 天会自己落到 2026-02-28,2026-01-01 减 1 天会越过年度边界落到 2025-12-31,闰年的 2024-03-01 减 1 天则落到 2024-02-29。这正是「不写每月天数表」的底气——二月天数、大小月与闰年都由公历规则统一处理。
工作日模式按方向逐日移动,每落到周六或周日就跳过,只在周一至周五扣减剩余天数。从 2026-10-10(周六)往前减 10 个工作日,先计入 2026-10-09(周五),最后到 2026-09-28(周一),实际跨过 12 个自然日。
闰年遵守公历规则:能被 4 整除且不能被 100 整除,或能被 400 整除。于是 2024 是闰年,2025、2026 不是;1900 不是闰年,2000 是。日期对象按这条规则处理跨二月,无需把每月天数写成固定表。
工作日换算只能作估算:每 7 自然日通常含 5 个工作日,所以 N 个工作日约等于 N × 7/5 个自然日。实际跨度还取决于起始星期;默认起点下 22 个工作日恰好跨 30 个自然日,而 100 个工作日实际跨 138 天。
完整示例(数值仅作演示)
从 2026-10-10(周六)按自然日往前推:减 1 天到 2026-10-09(周五),减 7 天到 2026-10-03(周六),减 30 天到 2026-09-10(周四),减 60 天到 2026-08-11(周二),减 90 天到 2026-07-12(周日),减 100 天到 2026-07-02(周四),减 180 天到 2026-04-13(周一),减 365 天到 2025-10-10(周五)。
工作日口径下,同一起点减 1 个工作日到 2026-10-09(跨度 1 天),减 5 个工作日到 2026-10-05(跨度 5 天),减 10 个工作日到 2026-09-28(跨度 12 天),减 22 个工作日到 2026-09-10(跨度 30 天),减 100 个工作日到 2026-05-25(跨度 138 天)。这些结果只跳过周末。
跨年与闰年也走同一算法:2026-01-01 减 1 天为 2025-12-31(周三);2024-03-01 减 1 天为 2024-02-29(周四);2026-03-01 减 1 天为 2026-02-28(周六)。
跨月、跨年与工作日对照表
下表列出跨月与跨年边界。后几行默认折叠,可点「加载更多」展开;「导出 CSV」会保存完整表并加入 UTF-8 BOM。
| 起始日期 | 减去天数 | 结果 |
|---|---|---|
| 2026-01-01 | 1 天 | 2025-12-31(周三) |
| 2026-01-01 | 30 天 | 2025-12-02(周二) |
| 2026-03-01 | 1 天 | 2026-02-28(周六) |
| 2026-03-01 | 30 天 | 2026-01-30(周五) |
| 2024-03-01 | 1 天 | 2024-02-29(周四) |
| 2024-03-01 | 30 天 | 2024-01-31(周三) |
| 2025-03-01 | 1 天 | 2025-02-28(周五) |
| 2026-12-31 | 1 天 | 2026-12-30(周三) |
| 2026-12-31 | 365 天 | 2025-12-31(周三) |
| 2026-06-15 | 15 天 | 2026-05-31(周日) |
| 2026-02-28 | 1 天 | 2026-02-27(周五) |
| 2024-02-28 | 1 天 | 2024-02-27(周二) |
工作日对照的自然日跨度依次表现为:减 20 个工作日到 2026-09-14,跨度 26 天;减 30 个工作日到 2026-08-31,跨度 40 天;减 60 个工作日到 2026-07-20,跨度 82 天。估算式给出的 28.0、42.0、84.0 天与实际值接近,但起始星期会造成差异。
下表是自然日与工作日的换算比。它按「每 7 自然日 = 5 工作日」折算,属于长期平均口径,只适合先估一个量级。
| 工作日数 | 折算自然日 | 默认起点实测跨度 |
|---|---|---|
| 1 | ≈ 1.4 天 | 1 天 |
| 5 | ≈ 7.0 天 | 5 天 |
| 10 | ≈ 14.0 天 | 12 天 |
| 20 | ≈ 28.0 天 | 26 天 |
| 22 | ≈ 30.8 天 | 30 天 |
| 30 | ≈ 42.0 天 | 40 天 |
| 60 | ≈ 84.0 天 | 82 天 |
| 100 | ≈ 140.0 天 | 138 天 |
读这张表要抓住两点。第一,实测跨度普遍比折算值短,因为起点 2026-10-10 是周六,向前移动时首先经过周末,被跳过的两天不消耗工作日额度。第二,22 个工作日对应 30 个自然日,这正是「一个月工作日」常见口径的来源;它成立的前提是期间不含法定节假日,遇到长假时应按当年安排逐日核对,不能继续沿用 22 这个数。
结果边界、舍入与适用说明
- 天数必须为整数;日期的最小单位是自然日,输入小数不会被四舍五入,而是给出明确错误。
- 天数为 0 时返回起始日期。负数会变成往后推,页面保留负号语义并在提示区说明方向。
- 超过 36500 天(100 年)仍计算,但提示「超出常见业务区间」。HTML 控件给出常用上限,脚本不会把超限值静默截断。
- 所有日期运算使用 UTC,不取浏览器本地午夜。结果中的星期同样来自 getUTCDay,与展示日期保持同一口径。
- 工作日只排除周六周日,不含法定节假日、调休上班日、企业假期或地区性休息日。中国法定节假日每年由国务院公布,应再对照当年安排。
- 每 7 自然日 = 5 工作日只是长期平均口径。默认起点下 10 个工作日实际跨 12 天,100 个工作日实际跨 138 天,不能用固定倍数替代逐日遍历。
常见问题
为什么日期运算必须用 UTC?
本地午夜可能遇到夏令时切换,两个相邻日历日之间不一定恰好是完整的自然日毫秒差。春季拨快一小时的当天只有 23 小时,秋季拨回一小时的当天有 25 小时,用毫秒差换算天数就会在这两天上出错。Date.UTC 与 getUTC 系列方法把运算固定在同一时区口径,每天恒为 86400000 毫秒,避免日期偏移。星期也必须同源:用 getUTCDay 读取,才不会与 getUTCFullYear 拼出的日期差一天。对跨时区协作尤其重要,同一输入在不同设备上不会算出两个答案。
工作日模式会排除中国法定节假日吗?
不会,只跳过周六周日。中国法定节假日每年由国务院公布,还可能包含调休上班日,不能由固定星期公式推导,结果需再对照当年安排。也就是说,遇到长假时本页给出的日期会比实际可办事的日子更晚,因为应放的假日被当成了工作日。反向的调休上班日则相反,本页会把它当成休息日跳过。若用于合同期限或时效判断,请以条款约定与官方公告为准,把本页结果当作排期参考。
起始日是周六,减 1 个工作日怎么算?
从 2026-10-10(周六)向前移动,首先遇到 2026-10-09(周五),它就是第 1 个工作日,所以结果为 2026-10-09,自然日跨度 1 天。
输入负数为什么会往后推?
页面按「目标日期 = 起始日期 − 天数」解释。当天数为负数,减负数等于向后移动;页面会保留这个方向并显示提示,不会把负数改成 0。
2024-03-01 减 1 天为什么是 2024-02-29?
2024 能被 4 整除且不能被 100 整除,是闰年,二月有 29 天;相对地 2026-03-01 减 1 天为 2026-02-28。
天数填 0 会发生什么?
结果就是起始日本身,星期与日期保持不变。这个边界可用于核对输入日期是否被正确解析。
这个工具免费吗?
免费,无需注册即可使用。
输入的数据安全吗?
安全。计算在当前浏览器本地完成,不会上传输入内容。
相关工具
- 工作日计算器:围绕工作日数量与周末排除进行排期。
- Unix 时间戳转换器:在时间戳与可读日期之间转换。
- 闰年判断工具:单独核对公历闰年规则。
- 圣诞节倒计时:查看固定节日距离当前日期的剩余时间。
- 年龄计算器:从出生日期推算年龄与时间跨度。