ToolDeck

日期计算器

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

什么是日期计算?

日期计算是求两个日历日期之差、或对给定日期加减时间段的过程。在线日期计算器可让您无需手动计数,直接求出任意两个日期之间精确的天数、周数、月数和年数。它广泛应用于项目规划、合同法律、财务会计和软件开发等领域。

日期计算的复杂性源于公历(格里历)结构的不规则性。月份天数为 28、29、30 或 31 天不等,年份则依闰年规则为 365 天或 366 天。简单地将日期数字相减,在跨越不同月份或年份时会产生错误结果。正确的日期差算法必须逐一处理每个日历单位,才能应对这些不规则性。

日期算术在许多编程场景中都会出现:计算令牌过期时间、调度周期性事件、计算 SLA 截止日期,或测量日志条目之间的时间间隔。在 DevOps 工作流中,它体现为证书有效期窗口、部署冻结时长和值班轮换周期。虽然大多数编程语言都提供日期处理库,但基于浏览器的计算器无需编写代码、安装依赖或打开 REPL,即可即时得到答案。

为什么使用这个日期计算器?

即时分解任意两个日期之间的时间差,同时以多种单位显示结果。无需公式,无需编码,无需注册。

即时结果
选取两个日期,即可查看以年、月、周、天、小时和分钟表示的差值。修改任一日期后结果实时更新。
🔒
隐私优先
所有计算均在浏览器本地运行。日期数据不会发送至任何服务器,也不会被存储或记录。
📅
多种输出单位
同时以所有单位显示结果:总天数、周数、月数,以及完整的年-月-日分解。无需自行在单位之间换算。
🔢
无需账号
打开即用,无需登录、无需订阅、无使用限制。收藏页面,随时进行快速日期查询。

日期计算器使用场景

前端开发
查询功能上线日期还有多少天、验证倒计时逻辑,或针对预期时间间隔测试日期选择器组件。
后端工程
验证令牌过期窗口、计算缓存 TTL 时长,或确认定时任务的时间间隔能否产生正确的下次运行日期。
DevOps 与 SRE
在故障复盘中测量事故时间戳之间的间隔、计算证书到期前置时间,或确定节假日期间的部署冻结时长。
QA 与测试
生成具有特定日期偏移量的测试数据、通过计算精确年龄验证年龄限制逻辑,或确认日期边界条件是否被正确处理。
项目管理
计算迭代周期、衡量里程碑之间的工作日天数,或从开始日期起按日历天数估算交付时间线。
学生与学习者
计算距考试还有多少天、计算学期长度,或验证计算机科学课程中日期算术习题的答案。

日期时长单位参考

日期差计算涉及长度各异的单位。月份和年份不是固定时长,这正是简单地将总天数相除会产生不准确结果的原因。下表列出了每个单位及其取值范围:

单位等价关系说明
1 year365 or 366 daysDepends on leap year
1 month28–31 daysVaries by month
1 week7 daysFixed
1 day24 hoursFixed (ignoring DST transitions)
1 hour3,600 secondsFixed
1 minute60 secondsFixed

常见日期格式

在程序中处理日期时,格式决定了日期字符串的解析方式。使用错误的格式会导致难以察觉的缺陷。ISO 8601 是数据交换的最安全选择,因为它无歧义且支持时区。下表列出了最常见的日期格式:

格式示例使用场景
ISO 86012026-04-10T14:30:00ZAPIs, databases, logs
RFC 2822Fri, 10 Apr 2026 14:30:00 +0000Email headers, HTTP
Unix timestamp1775831400Epoch-based systems
US format04/10/2026User-facing (US locale)
European format10.04.2026User-facing (EU locale)
Short ISO2026-04-10HTML date inputs, SQL DATE

代码示例:计算两日期之间的天数

以下是在 JavaScript、Python、Go 和命令行中计算两个日期差值的可运行示例。每个代码片段均展示了总天数计算,以及在语言支持的情况下按日历单位的分解方式。

JavaScript
// Calculate days between two dates
const start = new Date('2026-01-15')
const end = new Date('2026-04-10')
const diffMs = end.getTime() - start.getTime()
const diffDays = Math.floor(diffMs / (1000 * 60 * 60 * 24))
console.log(diffDays) // → 85

// Get year, month, day breakdown
function dateDiff(a, b) {
  let years = b.getFullYear() - a.getFullYear()
  let months = b.getMonth() - a.getMonth()
  let days = b.getDate() - a.getDate()
  if (days < 0) {
    months--
    days += new Date(b.getFullYear(), b.getMonth(), 0).getDate()
  }
  if (months < 0) { years--; months += 12 }
  return { years, months, days }
}
console.log(dateDiff(start, end)) // → { years: 0, months: 2, days: 26 }
Python
from datetime import date, timedelta
from dateutil.relativedelta import relativedelta

start = date(2026, 1, 15)
end = date(2026, 4, 10)

# Total days
diff = (end - start).days
print(diff)  # → 85

# Year/month/day breakdown (requires python-dateutil)
rd = relativedelta(end, start)
print(f"{rd.years}y {rd.months}m {rd.days}d")  # → 0y 2m 26d

# Add 90 days to a date
future = start + timedelta(days=90)
print(future)  # → 2026-04-15
Go
package main

import (
	"fmt"
	"time"
)

func main() {
	start := time.Date(2026, 1, 15, 0, 0, 0, 0, time.UTC)
	end := time.Date(2026, 4, 10, 0, 0, 0, 0, time.UTC)

	// Total duration
	diff := end.Sub(start)
	days := int(diff.Hours() / 24)
	fmt.Println(days) // → 85

	// Add 90 days
	future := start.AddDate(0, 0, 90)
	fmt.Println(future.Format("2006-01-02")) // → 2026-04-15
}
CLI (GNU date / macOS)
# Days between two dates (GNU coreutils)
echo $(( ($(date -d "2026-04-10" +%s) - $(date -d "2026-01-15" +%s)) / 86400 ))
# → 85

# Add 90 days to a date (GNU date)
date -d "2026-01-15 + 90 days" +%Y-%m-%d
# → 2026-04-15

# macOS (BSD date) — add 90 days
date -j -v+90d -f "%Y-%m-%d" "2026-01-15" +%Y-%m-%d
# → 2026-04-15

常见问题

如何计算两个日期之间的天数?
将较晚的日期减去较早的日期,得到以毫秒(或语言原生时长类型)表示的差值,再除以一天的毫秒数(86,400,000),即可得到总经过天数。若需按年、月、剩余天数进行日历分解,则需逐一遍历每个单位,因为月份的长度各不相同。
日期差是否包含开始日期或结束日期?
按惯例,日期差计算的是两个日期之间的天数,不包含开始日期或结束日期的其中一端。例如选取 1 月 1 日和 1 月 2 日,结果为 1 天。若您的场景需要包含两端的计数(即两个端点都计入),将结果加 1 即可。本工具遵循大多数编程语言所采用的不含末端的惯例。
日期计算如何处理闰年?
闰年增加 2 月 29 日,使该年为 366 天而非 365 天。公历闰年规则为:能被 4 整除,但世纪年必须同时能被 400 整除。因此 2024 年和 2028 年是闰年,1900 年不是,2000 年是。基于日历单位(年/月/日)计算日期差的算法会自动处理这一问题。转换为总天数的算法则必须在日期范围跨越 2 月 29 日时计入额外的一天。
日历天数和工作日天数有什么区别?
日历天数包含所有天数,含周末和节假日。工作日(也称工作天)不含周六、周日和法定节假日。本工具计算的是日历天数。若需转换为近似工作日天数,将总日历天数乘以 5/7 即可。若需精确的工作日天数,还需参照相关司法管辖区的节假日日历。
我能通过在开始日期上加天数来计算未来日期吗?
可以。在 JavaScript 中,创建一个 Date 对象并调用 setDate(getDate() + n)。在 Python 中,将 timedelta(days=n) 加到 date 对象上。在 Go 中,使用 time.AddDate(0, 0, n)。本工具专注于两个已知日期之间的差值计算,但您可以用它来验证您的算术:输入开始日期和预期结果日期,确认总天数输出与您所加的偏移量一致。
为什么不同工具给出的月份差结果不同?
月份计算存在歧义,因为各月天数不同。例如 1 月 31 日到 2 月 28 日:算 1 个月,还是 0 个月零 28 天?不同的库有不同的处理方式。最常见的惯例(Python 的 dateutil、Java 的 Period 以及本工具均采用此方式)将满一个月定义为达到相同的日期,或较短月份的最后一个有效日期。在对比结果时,请务必确认您所使用的库采用了哪种惯例。
日期计算会受时区影响吗?
当您选择不含时间分量的日期(仅年-月-日)时,计算与时区无关,因为它基于日历日期而非时间点进行运算。若需计算两个具体时刻之间的差值(含时间和时区),应使用完整的 ISO 8601 时间戳,并在相减前将两者均转换为 UTC。本工具仅对日历日期进行操作。