日期间隔计算器
计算两个日期之间的天数、周数、月数、年数等时间差
计算两个日期之间的间隔
什么是日期间隔计算器?
日期间隔计算器用于测量两个日历日期之间相差多久,并把结果换算成天数、周数、约等于多少月、约等于多少年,以及小时、分钟等更小单位。它适合核对项目周期、请假区间、账期跨度、纪念日、资料保存期限和历史日期间隔。需要注意,日期间隔不一定等同于“包含首尾两天”的天数:例如 1 月 1 日到 1 月 3 日相差 2 天,除非业务规则要求把两端都算入。月数和年数通常只能近似,因为月份长度不一致。涉及工作日、节假日、时区或法律截止日期时,应按对应规则另行计算。
使用方法
使用方法
- 输入起始日期
- 输入结束日期
- 点击「计算间隔」比较两个日期
- 查看结果:日、周、月、年、时、分、秒
计算规则
- 确认任务是按不含端点的区间计算还是包含两端日期;许多业务规则会将起始日和结束日都计入。
- 跨时区工作时,请先将日期转换到同一时区,特别是需要精确到小时或分钟时。
使用场景
技术原理
精确的天数差计算为 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 年之前的日期使用回推格里高利历计算,与当时实际使用的历法存在差异。
计算是在本地完成的吗?
是的。两个日期与计算结果都留在你的浏览器中,不会上传或记录任何数据。