时间日期 · 时间戳转换

日期差计算

两日期间天/周/月/年差

本地处理 · 不上传 免费 · 无需登录 无次数限制 累计 64 次使用
两日期 → 天 / 周 / 月 / 年 / 工作日差
起始日期start
结束日期end
计算选项options
天数差用本地日期零点计算,无时区偏移、无夏令时干扰;月 / 年差按 日历推进 + 日借位,非 30/365 天近似;跨闰年 2/29 自动处理。
请选择起始与结束日期
就绪 · 总天数 = 结束日 − 起始日(本地零点)
第一节

关于本工具

About

合同到期日、项目截止日、账期起止日……两日期之间的精确差,手动数日历常出错,尤其跨月跨年。输入起始与结束日期,工具直接输出天、周、月、年四种单位的结果,月差按日历月整月计算,年差同理。所有计算在浏览器内完成,数据不上传服务器,可放心粘贴敏感日期。

使用场景

信用卡还款日计算

每月工资 15 号发,但信用卡账单日和还款日相隔 20 天,记混了就容易逾期。用这个工具输入账单日(如每月 5 号)和还款日(如每月 25 号),直接算出两个日期之间的间隔天数。把结果设成手机日历提醒,再也不用担心记错日期多付利息。

装修合同工期核验

装修公司合同写“工期 60 个自然日”,但实际从 3 月 1 日开工到 5 月 10 日才完工。用工具输入两个日期,算出实际经过天数为 70 天。拿着这个结果找装修公司谈延期赔偿,每超一天按合同价款的千分之一索赔,有理有据。

项目里程碑倒排

产品经理要在 6 月 30 日上线新功能,从今天 3 月 1 日开始倒推。用工具分别输入 3 月 1 日和 6 月 30 日,算出间隔 121 天。按 3 周需求评审、6 周开发、4 周测试、2 周灰度发布来拆分,每个阶段截止日期一目了然,避免开发延期导致上线跳票。

签证停留期核查

申根签证有效期 90 天,但规定在 180 天内累计停留不超过 90 天。用工具输入入境日期(如 2024 年 7 月 1 日)和预计离境日期(如 2024 年 8 月 15 日),算出停留 45 天。再往前推 180 天,检查之前是否有过入境记录,确保总停留不超限,避免被海关拒绝入境。

租赁合同到期提醒

租房合同签了 1 年,从 2024 年 1 月 1 日到 2024 年 12 月 31 日。用工具输入两个日期,算出正好 365 天。提前 30 天(11 月 1 日)设置提醒,这时候跟房东谈续租还是找新房,时间上完全来得及,避免临时仓促搬家。

对比矩阵

维度本工具在线日期计算器手工计算
隐私纯浏览器计算,数据不出本地需上传日期到对方服务器完全离线,无数据外传
速度输入即出结果,毫秒级响应依赖网络,受页面加载影响需手动数日历或心算,分钟级
离线可用支持,加载后断网仍可计算不可用,必须联网完全离线
单位覆盖天/周/月/年差,含跨年/闰年处理多数只支持天差,月年需手动换算仅天差可数,月年差需查表
批量计算不支持批量,单次一对日期部分支持批量输入(需注册)完全手工,一次一对
收费免费,无隐藏付费基础免费,高级功能(如批量/导出)需会员免费(纸笔/日历成本)
第二节

使用指南

Getting Started

使用步骤

  1. 1在「开始日期」和「结束日期」输入框分别点选或键入两个日期,日历控件自动校验格式
  2. 2点击「计算差值」按钮,结果区立即显示天数差,并同步换算为周数、月数、年数
  3. 3点选结果区任一单位(如「月」),该值高亮并自动复制到剪贴板,底部提示「已复制」
  4. 4如需切换日期顺序,点两日期输入框中间的交换图标,结果自动重新计算并刷新

输入输出示例

输入输出说明
2024-01-01 至 2024-12-31相差 365 天(52 周 1 天,12 个月,1 年)常规:完整平年,验证天、周、月、年四种单位的正确换算
2023-03-01 至 2023-03-01相差 0 天(0 周,0 个月,0 年)边界:同一天,检查零值输出是否合理,避免出现负数或空串
2024-02-29 至 2025-02-28相差 365 天(52 周 1 天,11 个月 28 天,1 年)边界:闰日跨年,月差计算因 2 月天数不同易产生歧义,需验证算法
2000-01-01 至 2099-12-31相差 36524 天(5217 周 5 天,1199 个月,99 年)边界:跨世纪长区间,测试大数值溢出与闰年累积误差
2023-01-31 至 2023-02-28相差 28 天(4 周,0 个月 28 天,0 年)易错:月末对月末,月差容易误解为 1 个月(实际不足整月),需明确输出单位
2024-06-15 至 2024-06-15 23:59:59相差 0 天(0 周,0 个月,0 年)易错:用户可能误以为包含时间差,本工具仅按日期计算,忽略时分秒
2025-01-01 至 2024-12-31相差 1 天(0 周 1 天,0 个月 1 天,0 年)易错:结束日期早于开始日期,检查是否返回绝对值或提示顺序错误

常见错误对照

1.日期格式混用,工具无法识别

✗ 错误2024/1/5
✓ 修复2024-01-05

工具严格按 ISO 8601 标准(YYYY-MM-DD)解析输入,斜杠或缺少前导零会导致解析失败或结果异常。

2.结束日期早于开始日期,结果出现负数

✗ 错误开始日期填 2024-12-01,结束日期填 2024-11-01
✓ 修复开始日期填 2024-11-01,结束日期填 2024-12-01

工具按结束减开始的顺序计算,颠倒顺序会得到负值。如需正数结果,应始终将较早日期设为开始日期。

3.跨月天数差理解偏差,误以为固定 30 天

✗ 错误计算 2024-01-15 到 2024-02-15 的天数差,预期 30 天
✓ 修复实际结果为 31 天(1 月有 31 天)

天数差按实际日历日计算,不是按 30 天/月折算。1 月 15 日到 2 月 15 日跨越了完整的 1 月 31 天区间。

4.闰年 2 月 29 日被当作无效日期

✗ 错误输入 2023-02-29
✓ 修复2023 年不是闰年,应输入 2023-02-28 或 2024-02-29

公历闰年规则:能被 4 整除但不能被 100 整除,或能被 400 整除。2023 年不满足条件,2 月只有 28 天。

5.月差结果误解为整月数,忽略剩余天数

✗ 错误2024-01-15 到 2024-03-10 的月差,认为结果是 2 个月
✓ 修复实际月差为 1 个月零 24 天(工具会同时显示月数和剩余天数)

月差计算只计数完整月份跨度,不足一月的部分以天数显示。1 月 15 日到 3 月 15 日才满 2 个月,提前到 3 月 10 日只有 1 个月。

6.年差忽略闰日影响,直接除 365

✗ 错误认为 2020-03-01 到 2021-03-01 是 365 天
✓ 修复实际为 366 天(2020 年是闰年,包含 2 月 29 日)

年差按实际跨越的日历天数计算,不是简单除以 365。闰年多出的 2 月 29 日会计入总天数。

7.周差计算时,把不足 7 天的部分算作 1 周

✗ 错误2024-01-01 到 2024-01-05,认为周差是 1 周
✓ 修复实际周差为 0 周(仅 4 天,不足 7 天)

周差只统计完整的 7 天周期。不足 7 天的零头天数会被单独显示,不会向上取整。

8.时间部分被忽略,导致日期边界判断错误

✗ 错误认为 2024-01-01 23:59 到 2024-01-02 00:01 是 1 天差
✓ 修复工具只处理日期部分(忽略时分秒),所以这两个日期差为 1 天

工具输入字段仅接受日期,不包含时间。所有日期按 00:00:00 处理,所以同一天的不同时刻也被视为同一天。

第三节

工作原理

How It Works

核心公式

天数差 = |D2 - D1|,月数差 = (Y2 - Y1) × 12 + (M2 - M1) + (D2 ≥ D1 ? 0 : -1),年数差 = floor(月数差 / 12),周数差 = floor(天数差 / 7)

变量说明

  • D1, D2起始日和结束日,公历日期
  • Y1, Y2起始年和结束年
  • M1, M2起始月和结束月
  • 天数差两日期间隔的绝对天数
  • 月数差整月数,不足整月舍去
  • 年数差整年数,向下取整
  • 周数差整周数,向下取整

示例

从 2023-03-15 到 2025-07-20:天数差 = |2025-07-20 - 2023-03-15| = 858 天(含闰年 2024 的 366 天);月数差 = (2025-2023)×12 + (7-3) + (20≥15?0:-1) = 24+4+0 = 28 个月;年数差 = floor(28/12) = 2 年;周数差 = floor(858/7) = 122 周。

输入两个日期拆分年月日(年/月/日分别提取)计算差值(天/周/月/年)输出结果⚠ 月份差按日历月计算(非30天均分)
用户输入 本地处理 输出结果
第四节

开发者集成

For Developers

5 种主流语言实现,复制即用:

from datetime import date def date_diff(d1: date, d2: date) -> dict: delta = d2 - d1 days = delta.days weeks = days // 7 months = (d2.year - d1.year) * 12 + (d2.month - d1.month) years = d2.year - d1.year # 如果结束日期的月日小于起始日期,说明不满整年 if (d2.month, d2.day) < (d1.month, d1.day): years -= 1 return {"天": days, "周": weeks, "月": months, "年": years} # 示例:2024-01-15 到 2025-03-20 print(date_diff(date(2024, 1, 15), date(2025, 3, 20)))
function dateDiff(d1, d2) { const msPerDay = 86400000; const days = Math.round((d2 - d1) / msPerDay); const weeks = Math.floor(days / 7); let months = (d2.getFullYear() - d1.getFullYear()) * 12 + (d2.getMonth() - d1.getMonth()); let years = d2.getFullYear() - d1.getFullYear(); if (d2.getMonth() < d1.getMonth() || (d2.getMonth() === d1.getMonth() && d2.getDate() < d1.getDate())) { years--; } return { days, weeks, months, years }; } // 示例:2024-01-15 到 2025-03-20 console.log(dateDiff(new Date(2024, 0, 15), new Date(2025, 2, 20)));
package main import ( "fmt" "time" ) type DateDiff struct { Days int Weeks int Months int Years int } func diff(d1, d2 time.Time) DateDiff { days := int(d2.Sub(d1).Hours() / 24) weeks := days / 7 years := d2.Year() - d1.Year() months := years*12 + int(d2.Month()-d1.Month()) if d2.YearDay() < d1.YearDay() { years-- } return DateDiff{Days: days, Weeks: weeks, Months: months, Years: years} } func main() { d1 := time.Date(2024, 1, 15, 0, 0, 0, 0, time.UTC) d2 := time.Date(2025, 3, 20, 0, 0, 0, 0, time.UTC) fmt.Printf("%+v\n", diff(d1, d2)) }
#!/bin/bash # 依赖 dateutils(Linux 包管理器安装) d1="2024-01-15" d2="2025-03-20" days=$(datediff "$d1" "$d2") weeks=$((days / 7)) months=$(datediff -f '%m' "$d1" "$d2") years=$(datediff -f '%y' "$d1" "$d2") echo "天: $days, 周: $weeks, 月: $months, 年: $years"
import java.time.LocalDate; import java.time.temporal.ChronoUnit; public class DateDiff { public static void main(String[] args) { LocalDate d1 = LocalDate.of(2024, 1, 15); LocalDate d2 = LocalDate.of(2025, 3, 20); long days = ChronoUnit.DAYS.between(d1, d2); long weeks = days / 7; long months = ChronoUnit.MONTHS.between(d1, d2); long years = ChronoUnit.YEARS.between(d1, d2); System.out.printf("天: %d, 周: %d, 月: %d, 年: %d%n", days, weeks, months, years); } }
第五节

常见问题

Q & A
算两个日期之间的天数,包不包含头尾那两天?

不同场景下“天数差”的定义不一样。本工具默认按“日期差”计算,即从开始日0点到结束日0点之间的完整天数,不包含结束日当天。例如1月1日到1月2日,结果是1天。如果你需要计算“包含起止日”的天数(比如算请假天数),请手动+1。结果区会明确标注计算方式,避免歧义。

为什么我算出来的月数和我自己数的不一样?

月数差有两种常见算法:按“月历”算(比如1月15日到2月14日算1个月)和按“30天固定值”算。本工具采用前者,即基于实际月份边界,不满一个月的部分按天数单独显示。例如1月31日到2月28日,月差为0个月28天,而不是1个月。如果你需要固定30天/月的商业计算,可以手动用天数除以30。

这个工具支持农历日期吗?我想算两个农历日期的间隔。

目前仅支持公历(阳历)日期。农历日期因为闰月、大小月不固定,无法直接用公历算法计算间隔。建议先将农历日期转换为公历(网上有农历转公历工具),再用本工具计算。未来是否会支持农历取决于用户需求反馈。

我输入了日期但提示格式不对,到底要输什么格式?

本工具接受最常见的日期格式:YYYY-MM-DD(如2024-03-15)和YYYY/MM/DD(如2024/03/15)。不支持带中文的格式(如2024年3月15日)、点分格式(2024.3.15)或省略年份的格式(03-15)。如果粘贴的日期来自Excel或数据库,请先转换为标准格式再输入。

算出来的周数为什么不是整数?比如7天显示1周,但8天显示1周1天。

这是按“完整周+剩余天数”的逻辑显示的。8天 = 1周(7天) + 1天,所以显示1周1天。如果你需要的是“向上取整的周数”(比如8天算2周),或者“向下取整”(8天算1周),本工具不提供这种四舍五入模式。结果区会同时展示天数,方便你自己换算。

这个工具是纯前端算的吗?我输入的日期会不会上传到服务器?

完全纯前端计算,所有逻辑在浏览器内执行,不会将任何日期数据发送到服务器。关闭页面后数据自动清除。如果你对隐私敏感,甚至可以断网使用——打开页面后断开网络,工具仍然正常工作。

我想算从今天到某个截止日期还剩多少天,每次都要手动改开始日期吗?

是的,开始日期需要手动填写今天日期。本工具没有“自动填入今天”按钮,因为不同用户对“今天”的时区定义可能不同(比如跨时区用户)。建议用快捷键快速输入:在日期输入框按Ctrl+;(Windows)或Cmd+;(Mac)可自动填入当前日期。

算年份差的时候,比如2020年2月29日到2021年2月28日,算一年还是不到一年?

按实际日期计算:2020年2月29日到2021年2月28日,因2021年2月没有29日,系统会按2月28日作为结束日,结果是0年11个月30天(差1天满一年)。这种边界情况在闰年比较常见,结果区会精确显示到天,避免“一年”的模糊表述。

为什么我算两个日期差,结果和手机日历里的“日期间隔”功能不一样?

不同应用对“日期差”的定义可能不同。手机日历通常计算“包含起止日的天数差”(比如从1日到3日算3天),而本工具计算的是“经过天数”(1日到3日算2天)。另外,手机日历有时会忽略时间部分,而本工具假设起止日均为0点。建议对比时先确认对方工具的计算规则。

我算出来结果怎么是负数?是不是工具出bug了?

不是bug。本工具允许结束日期早于开始日期,此时结果会显示负数(如-5天),表示“提前了5天”。如果你只需要正数差值,请确保开始日期早于结束日期。如果需要绝对值,可以交换两个日期再算一次。

隐私保证所有计算与处理均在你的浏览器本地完成,输入数据不会上传服务器,也不会保存或共享。

选择 打开 +新窗口 esc关闭