ToolAct工具行动

日期间隔计算器

计算两个日期之间的天数、周数、月数、年数等时间差

计算两个日期之间的间隔

什么是日期间隔计算器?

日期间隔计算器用于测量两个日历日期之间相差多久,并把结果换算成天数、周数、约等于多少月、约等于多少年,以及小时、分钟等更小单位。它适合核对项目周期、请假区间、账期跨度、纪念日、资料保存期限和历史日期间隔。需要注意,日期间隔不一定等同于“包含首尾两天”的天数:例如 1 月 1 日到 1 月 3 日相差 2 天,除非业务规则要求把两端都算入。月数和年数通常只能近似,因为月份长度不一致。涉及工作日、节假日、时区或法律截止日期时,应按对应规则另行计算。

使用方法

使用方法

  1. 输入起始日期
  2. 输入结束日期
  3. 点击「计算间隔」比较两个日期
  4. 查看结果:日、周、月、年、时、分、秒

计算规则

  • 确认任务是按不含端点的区间计算还是包含两端日期;许多业务规则会将起始日和结束日都计入。
  • 跨时区工作时,请先将日期转换到同一时区,特别是需要精确到小时或分钟时。

使用场景

精确计算两个日期之间的天数差距选择起始和结束日期,计算以天为单位的间隔,额外显示周数、近似月数、近似年数、小时、分钟和秒数。计算遵循格里高利历规则,因此 1900 年视为平年,2000 年视为闰年,当任一端点接近 2 月 29 日时这一点很重要。
检查事件和记录的经过时间用于订阅、服务期、旅行跨度、项目时间线、纪念日、学习连续天数以及任何跨月手动计数容易出错的记录。将两个源日期与结果放在一起,以便日后核查间隔,因为声称的「36 个月」比原始的起止日期对更难审计。
谨慎使用近似月数和年数主要结果是天数。月和年是近似摘要值,计费周期、法定年龄和合同规则应使用该语境所要求的具体规则。近似值用于参考定位,而非最终政策决策。ISO 周数(第 1 周包含该年第一个星期四)是简单的天数计数本身不会产生的另一种约定。
引用差距前决定包含端点还是排除端点对于休假范围和试用期,事先约定是否计入两端,然后将结果标注为「之间」或「跨越」,避免法务、人事和财务报告出现分歧。差一错误在单个范围上看似微不足道,但在约定未统一应用于人事、薪资和财务导出时会累积放大。
将近似月数与具体日历交叉核对当计费周期、试用期或保修窗口以月或年定义时,用感知日历的规则运行同一组日期,确认近似值与政策一致。在同一报告中混用两种单位是合同纠纷的常见来源,尤其是同一客户同时使用 30 天方案和日历月方案的 B2B SaaS 续费。写明「自起始日期起 12 个月」的周年条款通常指恰好一个日历年而非 365 天,因此 1 月 15 日开始意味着次年 1 月 15 日,而非 1 月 14 日或 1 月 16 日。

技术原理

精确的天数差计算为 Math.floor((end.getTime() - start.getTime()) / 86_400_000),其中 86,400,000 是非夏令时 24 小时一天的毫秒数。这给出的是排他区间——1 月 1 日到 1 月 3 日是 2 天而非 3 天——因为减法测量的是两个时刻之间的跨度而非计算日历格子。对于包含两端的计数(两端都算),在结果上加 1;许多法律、请假和计费规则要求这样做,差一错误是人事和财务报告之间产生分歧的最常见原因。周就是天数 / 7;页面还显示小时 = 天数 * 24、分钟 = 天数 * 1440 和秒 = 天数 * 86,400 作为派生总量。 月数和年数特意标注为"近似",因为日历月和日历年的长度不一。简单方法是天数 / 30.436875(平均格里高利月)和天数 / 365.2425(400 年周期的平均格里高利年),这对于状态报告和仪表盘来说足够好,但对于合同来说是错误的。对于日历精确的"X 个完整月之间",算法减去年 x 12 + 月的分量,然后如果结束日期的天小于开始日期的天则减 1——这就是大多数日期库(date-fns differenceInMonths、dayjs $.diff('month')、Temporal Duration.from)的计算方式。年数计算有同样的怪癖:2024-02-29 到 2025-02-28 有时算作 1 年(限制到月末),有时算作 0 年 11 个月 30 天,取决于约定。 闰年遵循格里高利规则(能被 4 整除,但世纪年必须能被 400 整除,所以 1900 年是平年,2000 年是闰年,2024 年是闰年)。包含 2 月 29 日的区间会自动多出一天,因为天数计算基于自纪元以来的毫秒数,而不是日历字段。当两个端点处于亚天分辨率时,时区处理至关重要:从本地时间字符串构造的两个 Date 值相减可能差一个本地 UTC 偏移量,跨越夏令时转换的区间可能是 23 或 25 小时而非标称的 24 小时。Y2038 问题(Unix time_t 有符号 32 位溢出在 2038-01-19T03:14:07Z)不影响此页面,因为 JavaScript Date 使用 64 位浮点数,能够表示纪元两侧大约 1 亿天的日期,但用 32 位 C 编写的下游系统仍然需要注意。

  • 精确天数 = Math.floor((end - start) / 86_400_000);每个非夏令时天 8640 万毫秒。
  • 默认结果是排他的:1 月 1 日到 1 月 3 日 = 2 天;包含两端计数需加 1。
  • 近似月使用平均 30.436875 天;年使用 400 年格里高利周期的 365.2425 天。
  • 日历精确的月差:(y2-y1)*12 + (m2-m1),如果结束日 < 起始日则减 1——与 date-fns differenceInMonths 一致。
  • 闰年:能被 4 整除,但世纪年必须能被 400 整除(1900 年不是,2000 年是,2024 年是)。
  • 夏令时转换造成 23 小时和 25 小时的日历天;24 小时的减法不一定等于一个日历天。
  • JavaScript Date 是 64 位浮点数,不受 Unix Y2038(2038-01-19 03:14:07 UTC 的 32 位 time_t 溢出)影响。

示例

完整两年(2025-01-01 至 2026-12-31)

起始: 2025-01-01
结束: 2026-12-31

天数  : 730
周数  : 104.29
月数  : ~24.00(近似)
年数  : ~2.00(近似)
注意  : 2028 是范围之外的下一个闰年;如果延长到 2028-02-29 也会被纳入。

短间隔(3 天)

起始: 2026-06-11
结束: 2026-06-14

天数 : 3
小时 : 72
分钟 : 4320
秒数 : 259200
含首尾(两端都计入): 4 天

跨年的项目周期

起始: 2026-01-15(启动)
结束: 2026-07-20(上线)

天数  : 186
周数  : 26.57
月数  : ~6.16
使用场景: 状态周报、复盘总结、甘特图汇总

用天数计算年龄

生日      : 1995-03-15
今天      : 2026-06-11

累计天数  : 11,411
年数(近似): 31.24
月数      : ~374.9
适合需要精确到天的场景,比如各类纪念日

时区陷阱(东京 vs 洛杉矶)

同一日历日期 '2026-07-15' 对应的真实时间点并不相同:
  Tokyo  (UTC+9)  -> 2026-07-15 00:00 = 2026-07-14 15:00 UTC
  Los Angeles (UTC-7) -> 2026-07-15 00:00 = 2026-07-15 07:00 UTC
如果不处理时区直接相减,差值约为 16 小时,足以让 1 天的结果发生偏移。
解决办法: 相减前先把两个日期统一到同一时区。

常见问题

两个日期之间的差值是如何计算的?

采用日历运算:结果以「年、月、日」呈现,并附上换算成周、天、小时、分钟、秒的总计。年和月按周年法计算(必须经过相同的月日才会进位),天数则是两个日期之间的自然日数。

为什么「年 + 月 + 日」加起来不等于总天数?

因为月份长度在 28 至 31 天之间。「1 年 2 个月零 5 天」具体折算成多少天,取决于其中各月分别是 28、29、30 还是 31 天。总天数字段使用纯日历运算,是最精确的数值。

起始日是否计入?

本页不计入起始日——同一日期的差值显示为 0 天。如果需要按「含头含尾」方式计数(例如订房间的住宿夜数),请在结果上手动加 1。

是否会排除周末或节假日?

不会。本页统计的是每一个自然日。如需工作日差值(跳过周末以及可选节假日),请使用「工作日计算器」工具。

为什么经过夏令时切换后时间部分看起来对不上?

时和分部分使用绝对时间,因此跨夏令时切换会让时刻栏多出或少了一小时。但天数本身不受影响,因为天数差是按日历计算的。

可比较的日期范围有多大?

JavaScript Date 支持从 Unix 纪元前后各 100,000,000 天,因此约 ±271,000 年内的任意历史或未来日期都可以比较。1582 年之前的日期使用回推格里高利历计算,与当时实际使用的历法存在差异。

计算是在本地完成的吗?

是的。两个日期与计算结果都留在你的浏览器中,不会上传或记录任何数据。