年龄计算器 — 精确年龄(年、月和天)
年龄计算器只需输入出生日期,即可精确算出以年、月、日表示的当前年龄,并同时给出已经历的总周数、总天数和总小时数。工具还会自动计算距离下一个生日还剩多少天,也可以指定任意目标日期计算当时的年龄。适合用于填写表格、核对法定年龄、规划生日庆祝或单纯满足好奇心,计算结果会自动考虑闰年,保证结果准确无误。
年龄计算器
你出生于 Monday
下一个生日: 还有 127 天 (即将年满 37 岁)
你的年龄(其他单位)
生命进度
你的年龄相对于80年参考跨度的进度。
文档
什么是年龄计算器?
年龄计算器用于求出两个日期之间的精确时间:出生日期和目标日期(通常是今天)。它以年、月、日的形式给出结果,同时也给出以周、天、小时、分钟和秒为单位的累计总数。也可以针对过去或未来的日期计算年龄,从而得知一个人在那一天已有或将有多大。
如何计算年龄
年龄是两个日历日期之间的间隔。描述这一间隔有两种正确方式,分别适用于不同用途。
按日历计算的年龄(年、月、日)
这是人们日常表达年龄的方式,例如“33岁4个月5天”。计算分为三步:
- 计算从出生日期起已经过去的完整年数。
- 从最近一次生日开始,计算已经过去的完整月数。
- 从该日期开始,计算剩余的天数。
第 3 步在接近月末时比较棘手,因为各个月份的天数并不相同。某人出生于一月 31 日,在三月 1 日计算年龄时,他是 1 个月又 1 天。一月 31 日之后的一个月是二月 28 日(闰年则是二月 29 日),因为二月没有 31 日。三月 1 日在其后一天。这种方法有时因推广它的 Python 库而被称为 relativedelta 规则,它会把周年日期限定在较短月份的最后一天,使天数永远不会变成负数。
总经过时间(天、小时、秒)
要精确计算经历的时间,需要先将两个日期转换为时间轴上的单一时点,再以完整天数计算差值:
天数 = floor((目标日期 − 出生日期) ÷ 86,400,000 毫秒)
相减前,两个日期都设为 UTC(协调世界时)午夜。这样可以避免夏令时变化增加或减少一小时,从而使天数计算出现偏差。根据天数总数,周数为天数除以7并向下取整。小时、分钟和秒数分别为天数乘以24、1,440和86,400。
将总天数除以365或365.25,可以得到近似的年龄(年),但这种方法不知道这段时间中哪些年份是闰年。上文所述的日历计算是准确的。回答“我多大了”时,应使用按日历计算的年龄。对于需要精确经过时间的任务,例如安排用药时间或倒计时至某个里程碑,则应使用总天数或总周数。
算例
某人出生于2000年1月1日,按2020年1月1日计算年龄:
| 项目 | 数值 |
|---|---|
| 按日历计算的年龄 | 20年0个月0天 |
| 总天数 | 7,305 |
| 总周数 | 1,043 |
| 出生日期是星期几 | 星期六 |
总计 7,305 天等于 20 × 365 加上 5 个闰日,对应闰年 2000、2004、2008、2012 和 2016。这些年份各自多出一个二月 29 日,落在这 20 年的跨度之内。因此天数高于简单的 20 × 365,也因此手工计算很容易出现几天的误差。
代码中的年龄计算公式
上述按日历计算年龄的方法可以在大多数编程语言中实现。使用内置的日期库,比手动编写闰年和月份天数规则更安全。
1from dateutil.relativedelta import relativedelta
2from datetime import date
3
4birth, target = date(2000, 1, 1), date(2020, 1, 1)
5
6age = relativedelta(target, birth) # calendar age
7print(f"{age.years}y {age.months}m {age.days}d")
8
9total_days = (target - birth).days # total elapsed days
10print(total_days) # 7305
111function addMonthsUTC(d, n) {
2 const total = d.getUTCMonth() + n;
3 const y = d.getUTCFullYear() + Math.floor(total / 12);
4 const m = ((total % 12) + 12) % 12;
5 const lastDay = new Date(Date.UTC(y, m + 1, 0)).getUTCDate();
6 return new Date(Date.UTC(y, m, Math.min(d.getUTCDate(), lastDay))); // clamp to month end
7}
8
9function calendarAge(birth, target) {
10 let months = (target.getUTCFullYear() - birth.getUTCFullYear()) * 12
11 + (target.getUTCMonth() - birth.getUTCMonth());
12 if (addMonthsUTC(birth, months) > target) months--;
13 const days = Math.floor((target - addMonthsUTC(birth, months)) / 86400000);
14 return { years: Math.floor(months / 12), months: months % 12, days };
15}
16
17const totalDays = Math.floor((target - birth) / 86400000); // 7305
181' Whole days between two dates (A1 = birth, B1 = target):
2=B1-A1
3
4' Calendar age in complete years / months / leftover days:
5=DATEDIF(A1, B1, "y") & " years, " & DATEDIF(A1, B1, "ym") & " months, " & DATEDIF(A1, B1, "md") & " days"
6Microsoft 不建议使用 DATEDIF 的“MD”单位。它可能返回负数、零或不准确的结果。
常见问题
如何查找我的准确年龄? 输入出生日期,并将目标日期保留为今天。结果会显示以年、月、日表示的年龄,以及按总天数、周数、小时数和秒数表示的相同年龄。
为什么两个年龄计算器会给出不同答案? 差异通常在于如何计算月份边界附近的剩余天数。如上所述,在月末将日期调整到较短月份的计算器,可能会与直接将经过的时间除以30的计算器相差一两天。
计算会考虑闰年吗? 会。总天数包含两个日期之间出现的每一个 2 月 29 日,出生日期为 2 月 29 日的人,在非闰年按 2 月 28 日计算。
可以计算过去或未来日期的年龄吗? 可以。将目标日期设为未来日期,会显示某人在那一天将有多大。设为过去日期,则显示他当时有多大。
时区会影响结果吗? 不会。计算天数前,两个日期都会转换为 UTC 午夜,因此无论用户所在位置或夏令时变化如何,总数都保持不变。
为什么天数总数与用365.25除天数所得的结果不同? 365.25只是平均年份长度;它不会记录这段时间中具体哪些年份是有366天的闰年。计算两个实际日历日期之间的完整天数是准确的。
参考文献
- dateutil 项目。relativedelta。dateutil relativedelta 文档 — 当加上的月份会超出较短月份的月末时,使用该月的最后一天。
- MDN Web Docs(Mozilla)。Date。MDN Date 参考 — JavaScript 日期是自 UTC 1970年1月1日 起的毫秒计数;±8.64 × 10¹⁵ 毫秒等于 ±100,000,000 天,因此一天为 86,400,000 毫秒。
- U.S. Naval Observatory(美国海军天文台)。Leap Years。USNO 闰年常见问题 — 能被 4 整除的年份是闰年,但不能被 400 整除的世纪年除外;2000 年是闰年。
- Microsoft。DATEDIF function。Microsoft 支持:DATEDIF — “Y”“YM”和“MD”单位,以及“MD”的已知局限。