跳到正文
DevTools / 日期差值计算器

日期差值计算器

距离截止日期还有多少天、这个迭代还剩几个工作日、这份合同按年月算是多久、从今天起九十天是哪一天——这些问题看似简单,答案却很容易算错,因为日历运算并不等于两个数相减。本计算器一次性给出所有单位的差值,正确处理月份长短不一的借位,并能按可配置的周末与节假日列表统计工作日。

完全在浏览器本地运行——不会上传任何内容。

日历差值

0 年 1 个月 0 天

总计 31 天 合计

总天数
31
总周数
4
总月数
1
总小时数
744
总分钟数
44,640
总秒数
2,678,400
工作日
—
自定义周末
周末日
0
起始星期Friday
结束星期Monday
起始 ISO2026-10-16T00:00:00.000Z
结束 ISO2026-11-16T00:00:00.000Z

工作原理

“两个日期的差值”里其实藏着两个不同的问题。精确经过时长是一个固定的毫秒数,可以干净地换算成天、小时和分钟。日历差值则是人们口中“三年零两个月”的意思,它取决于日期落在哪里:从 1 月 31 日到 2 月 28 日是日历上的一个月,而从 1 月 31 日到 3 月 3 日同样也是。本工具两者都给出,因为一份“为期一个日历月”的合同和一份“为期 28 天”的合同确实是不同的约定。

日历差值采用借位法计算,就像学校里的减法。当结束日期的“日”小于开始日期的“日”时,从“月”借一位,并加上上个月的天数——这就是算法必须知道 2024 年 2 月有 29 天而 2025 年 2 月只有 28 天的原因。算错这一点,正是计费系统和年龄计算在边界处出现“差一天”错误的原因。例如 2 月 29 日出生是一个著名的边界情形:有些司法管辖区把非闰年的 2 月 28 日视为生日,另一些则用 3 月 1 日。

工作日计数是日历上的算术,而不是数轴上的算术。先按可配置的掩码剔除周末,因为工作周并非处处都是周六周日——中东许多地区是周五和周六。再从剩余集合中剔除法定节假日,同时考虑落在周末的节假日不会额外减少一个工作日,以及部分国家存在调休。最终得到的正是项目经理或 SLA 计算真正需要的数字。

反方向的时长加法有自己的陷阱。1 月 31 日加一个月得到的是 2 月 28 日或 29 日,而不是 2 月 31 日,因此“日”会被夹取到目标月的最后一天;闰年的 2 月 29 日加一年得到 2 月 28 日。相比之下加天数是直截了当的,因为一天是固定长度——唯一例外是跨越夏令时切换时当地时间会平移一小时而日期不变,这也是本工具在日历问题上按日历日期而非经过毫秒进行运算的原因。

常见应用场景

  • 计算距离截止日期、续约日或产品发布还剩多少天。
  • 为表单或档案计算精确到年月日的年龄。
  • 统计项目周期内的工作日,排除周末与法定节假日。
  • 为发票或通知期推算九十天后的到期日。
  • 确认订阅周期是按日历月还是按天数计算。
  • 按年月计算员工入职时长,用于服务年限奖励。

最后更新: 2026-10-14

常见问题解答

两个日期之间有多少天?

用较晚的日期减去较早的日期即得到经过时长,再除以 86,400,000 毫秒即为天数。计算器同时给出以年月日表示的日历差值,以及以周、月、小时表示的总量。哪个数字正确取决于问题本身:三十天的通知期是三十个经过日,而一个月的通知期在同一天结束于下个月,两者长度并不相同。

开始日期应该算进去吗?

取决于你遵循的惯例,差别正好是一天。经过时长计算不含起始瞬间,因此从周一 09:00 到周二 09:00 是一天。许多法律和商务场景采用包含式计数,于是周一送达的三天通知在周三到期。计算器给出的是经过差值;如果你的惯例是包含式,请加一天,并且在任何需要推算截止日期的地方都明确说明用的是哪种惯例。

工作日计数如何处理节假日?

由你提供日期,它们会从候选日期集合中剔除,但只有当它们落在工作日时才会生效——落在周六的法定节假日已经被周末规则排除,不会再额外减少一个工作日。列表是手工录入而非内置的,这是刻意的:法定节假日因国家、地区和年份而异,内置列表总会在某处悄悄出错。请导入该司法管辖区当年公布的正式列表。

为什么加一个月得到的日期出乎意料?

因为月份长短不同,加一个月并不等于加三十天。通行的做法——也是本工具采用的做法——是夹取:1 月 31 日加一个月在平年是 2 月 28 日、在闰年是 2 月 29 日,因为 2 月 31 日并不存在。同样的规则适用于 3 月 31 日加一个月,得到 4 月 30 日。改成加天数可以完全避开这一歧义,这也是要求间隔恰好三十天的计费系统会明确用“天”而不是“月”的原因。

相关工具