日期时间 本地计算 开箱即用 内置示例 不留痕迹

恋爱天数计算器

填上在一起的那天,实时累计已走过的 X 年 X 个月 X 天、总天数与总秒数,并自动算出下一个整百天、整千天与周年纪念日的具体日期和倒计时,纪念日、生日、项目工期都适用。

「我们在一起多少天了?」——这个问题按秒算每天都在变。本工具从你填的起始日开始实时累计:满 X 年 X 个月 X 天的日历差、总天数、折合周数、总小时与总秒数(结束日期留空时按今天计,页面每秒刷新)。整百天、整千天与周年纪念日不用自己数:下一个第 N 天的日期和还差几天直接列在表里,提前安排惊喜刚刚好。

日历差按月推进:先数整年、再数整月、余下的是天,月末溢出按当月最后一天截断——1 月 31 日加 1 个月记为 2 月 28 日;2 月 29 日在一起的话,平年在 2 月 28 日满周年。日期填反了会自动交换并提示,结束日期填未来某天就是倒计时模式,算项目工期、宝宝预产期同样顺手。

使用步骤

  1. 填起始日期:在一起的那天、出生日或项目开始日。
  2. 结束日期留空默认统计到今天,也可以填未来日期做倒计时。
  3. 看累计:X 年 X 个月 X 天、总天数、总秒数实时更新。
  4. 看里程碑:下一个整百天、整千天与周年纪念日的日期和倒计时。

计算原理与示例

自然日口径与实时刷新

天数按自然日计算:起始日 0 点到结束日 0 点之间隔了几个自然日,就是总天数。用「UTC 中午法」取日期(把本地日期固定在当天中午再相减),避免了夏令时切换日 23 小时/25 小时造成的 ±1 天毛刺。结束日期留空时统计到今天,页面每秒刷新,总秒数实时走动;填具体日期就是固定区间统计。

月推进与月末截断

「X 年 X 个月 X 天」的日历差按月推进:先用年月差估计总月数,把起始日加上这些个月(月末溢出按当月最后一天截断,1 月 31 日加 1 个月是 2 月 28 日),如果超过了结束日就退一个月,剩余的自然日就是天数。2 月 29 日在一起的,平年在 2 月 28 日满周年——这是主流日历库(date-fns、moment)一致的口径。

里程碑与周年纪念日

里程碑以起始日为原点:下一个整百天、整千天是「第 N 天」对应的自然日,周年纪念日按上面的月推进规则算。表里同时给出目标日期和还差几天;如果今天恰好是周年当天,会显示「今天正好满 X 周年」。倒计时模式直接把结束日期填成未来某天即可,日期填反了会自动交换。

代码示例

JavaScript 按 UTC 归一化再相减(避开夏令时)

// 直接 (d2 - d1) / 86400000 在有夏令时的时区会得到 23 或 25 小时,算出小数天
const dayDiff = (a, b) => {
  const toUTC = (d) => Date.UTC(d.getFullYear(), d.getMonth(), d.getDate());
  return Math.round((toUTC(b) - toUTC(a)) / 86400000);
};

dayDiff(new Date('2026-01-01'), new Date('2026-03-01'));   // 59

// 加 N 天同理:用 Date.UTC 构造再取回本地年月日,跨月跨年自动进位
function addDays(date, n) {
  const t = Date.UTC(date.getFullYear(), date.getMonth(), date.getDate() + n);
  const d = new Date(t);
  return [d.getUTCFullYear(), d.getUTCMonth() + 1, d.getUTCDate()];
}
addDays(new Date('2026-02-27'), 1);        // [2026, 2, 28]

Shell 命令行算天数差

# Linux(GNU date):转成秒再相减
a=$(date -d 2026-01-01 +%s)
b=$(date -d 2026-03-01 +%s)
echo $(( (b - a) / 86400 ))

# macOS(BSD date):-j -f 指定输入格式
a=$(date -j -f %Y-%m-%d 2026-01-01 +%s)
b=$(date -j -f %Y-%m-%d 2026-03-01 +%s)
echo $(( (b - a) / 86400 ))

# 今天往后 30 天是哪天
date -d "+30 days" +%F            # Linux
date -v+30d +%F                   # macOS

常见问题

「X 年 X 个月 X 天」是怎么算的?

按日历推进:先数满几年,再数满几个月,剩下的零头是天数。月末溢出按当月最后一天截断,比如 1 月 31 日加 1 个月记为 2 月 28 日,所以结果是 1 个月 1 天而不是负数。

2 月 29 日在一起的怎么算周年?

平年没有 2 月 29 日,按月末截断口径在 2 月 28 日满周年(2020-02-29 的 1 周年是 2021-02-28)。整年天数仍按真实自然日计,闰年会多一天。

第 100 天是哪天?在一起当天算不算?

在一起当天是第 0 天,第 100 天是起始日 + 100 天的自然日。里程碑表会直接给出那天的日期和还差几天,不用自己数。

结束日期留空是什么意思?

留空表示统计到今天,页面每秒刷新一次,总秒数是实时走动的;填上具体日期则统计到那天为止,适合算某段固定区间的天数。

日期填反了会怎么样?

工具会自动把较早的日期当作起点并显示「已自动交换」提示,统计结果不受影响——不用删掉重填。

总秒数是实时走动的吗?

结束日期留空时是——页面每秒刷新一次,当天 0 点到现在已走过的秒数会不停增加;填了具体结束日期后所有数字都是固定值。

日期数据会上传吗?

不会。日期计算完全在本机浏览器里完成,不上传、不保存;页面上的计算历史仅存本机浏览器,可随时清空,无痕模式关闭即消失。

延伸阅读

来自本站原创文章,讲清这个工具背后的算法与口径。