时间差计算/ 年 · 月 · 天 · 小时 · 分钟

计算两个日期或时间之间的精确差值,分解为年、月、天、小时、分钟和秒,同时显示总天数、总周数。

开始
结束
从开始到结束的时间差
1
0
0
0
小时
0
分钟
0
365
总天数
52
总周数
8,760
总小时
525,600
总分钟

这个工具有帮到你吗?

代码示例

JavaScript (date-fns)
import {
  differenceInYears, differenceInMonths,
  differenceInDays, differenceInHours,
  formatDistanceToNow, intervalToDuration,
  format
} from 'date-fns';

const start = new Date('2020-01-15');
const end = new Date('2024-06-30');

differenceInYears(end, start)   // 4
differenceInDays(end, start)    // 1628
differenceInHours(end, start)   // 39072

// Human-readable breakdown
intervalToDuration({ start, end })
// { years:4, months:5, days:15, hours:0, ... }

// Relative time
formatDistanceToNow(start, { addSuffix: true })
// "about 4 years ago"
Python
from datetime import datetime, date
from dateutil.relativedelta import relativedelta

start = datetime(2020, 1, 15)
end = datetime(2024, 6, 30)

# Total difference
diff = end - start
diff.days          # 1628
diff.total_seconds() / 3600  # 39072.0

# Calendar-aware breakdown (pip install python-dateutil)
delta = relativedelta(end, start)
delta.years    # 4
delta.months   # 5
delta.days     # 15

# Age calculation
birthday = date(1990, 5, 20)
today = date.today()
age = relativedelta(today, birthday).years
Go
import (
  "fmt"
  "time"
)

start := time.Date(2020, 1, 15, 0, 0, 0, 0, time.UTC)
end := time.Date(2024, 6, 30, 0, 0, 0, 0, time.UTC)

duration := end.Sub(start)
fmt.Println(duration.Hours() / 24)  // 1628 days
fmt.Println(duration.Hours())       // 39072 hours

// Calendar diff (years/months) — manual calculation
years := end.Year() - start.Year()
months := int(end.Month()) - int(start.Month())
if months < 0 {
    years--
    months += 12
}
fmt.Printf("%d years, %d months\n", years, months)
SQL
-- MySQL / MariaDB
SELECT
  DATEDIFF('2024-06-30', '2020-01-15') AS days,
  TIMESTAMPDIFF(YEAR,  '2020-01-15', '2024-06-30') AS years,
  TIMESTAMPDIFF(MONTH, '2020-01-15', '2024-06-30') AS months,
  TIMESTAMPDIFF(HOUR,  '2020-01-15', '2024-06-30') AS hours;

-- PostgreSQL
SELECT
  '2024-06-30'::date - '2020-01-15'::date AS days,
  AGE('2024-06-30', '2020-01-15') AS human_readable;
  -- 4 years 5 mons 15 days

-- SQLite
SELECT julianday('2024-06-30') - julianday('2020-01-15');
-- 1628.0

常见问题

日期差计算为什么不能简单用毫秒相除?
毫秒相除只能得到精确的总时长,但不能得到直觉上的"几年几个月几天"。这是因为月份长度不固定(28-31天),年份也有平年/闰年之分。例如"2023年1月31日"加一个月应该是"2023年2月28日"(而不是3月3日)。本工具使用日历感知算法,得出与日常直觉一致的结果。
如何计算工龄或年龄?
输入入职日期(或出生日期)作为开始时间,当前日期作为结束时间,即可得到精确的年数(含余下月份和天数)。
两个日期之间有多少个工作日?
工作日计算比普通天数复杂:需要排除周末,如果还要考虑节假日则更复杂。基本算法:遍历日期范围,跳过周六和周日。生产环境建议使用专门的库(如 date-fns 的 differenceInBusinessDays)。
闰秒会影响时间差计算吗?
在普通的日期差计算中,闰秒(Leap Second)不会产生影响,因为 JavaScript 的 Date 对象和大多数操作系统的时间系统不区分闰秒。只有在极精确的时间测量场景中才需要考虑闰秒。
如何在 JavaScript 中获取相对时间(如"3天前")?
使用 Intl.RelativeTimeFormat API(现代浏览器原生支持):const rtf = new Intl.RelativeTimeFormat('zh', { numeric: 'auto' }); rtf.format(-3, 'day') → '3天前'。或使用 date-fns 的 formatDistanceToNow() 函数。
不同时区的时间差如何计算?
JavaScript 的 Date 对象内部存储的是 UTC 时间戳,时区信息在展示时才处理。因此直接用 date.getTime() 相减得到的差值是正确的,不受时区影响。