日期减天数计算器

从一个日期出发往前推 N 天,可切换自然日或只跳过周六周日的工作日;运算统一走 UTC,避免本地时区与夏令时造成日期偏移。

工作日口径:只跳过周六周日,不含法定节假日(中国法定节假日每年由国务院公布)。
—

默认从 2026-10-10(周六)往前推 30 个自然日,结果为 2026-09-10(周四);切到工作日模式并填 10,结果为 2026-09-28(周一),自然日跨度 12 天。

使用方法

  1. 起始日期服务端直出为 2026-10-10(周六),即使脚本尚未执行,输入框也不是空白。
  2. 天数默认 30。正数表示从起始日往前推,负数表示反向往后推;填 0 则返回起始日本身。
  3. 自然日模式逐日计算,周六周日也计入;工作日模式只在经过周一至周五时扣减天数。
  4. 按回车或点「计算目标日期」,结果会同时给出日期、星期、方向与自然日跨度。下方对照表可按 TSV 复制。
  5. 工作日模式不含法定节假日。中国法定节假日每年由国务院公布,不能仅凭星期公式推导。

这个日期减天数计算器能解决什么问题

本页解决的是「已知一个日期,往前推 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-011 天2025-12-31(周三)
2026-01-0130 天2025-12-02(周二)
2026-03-011 天2026-02-28(周六)
2026-03-0130 天2026-01-30(周五)
2024-03-011 天2024-02-29(周四)
2024-03-0130 天2024-01-31(周三)
2025-03-011 天2025-02-28(周五)
2026-12-311 天2026-12-30(周三)
2026-12-31365 天2025-12-31(周三)
2026-06-1515 天2026-05-31(周日)
2026-02-281 天2026-02-27(周五)
2024-02-281 天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 这个数。

结果边界、舍入与适用说明

常见问题

为什么日期运算必须用 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 会发生什么?

结果就是起始日本身,星期与日期保持不变。这个边界可用于核对输入日期是否被正确解析。

这个工具免费吗?

免费,无需注册即可使用。

输入的数据安全吗?

安全。计算在当前浏览器本地完成,不会上传输入内容。

相关工具