年龄计算器 — 精确年龄(年、月和天)
年龄计算器只需输入出生日期,即可精确算出以年、月、日表示的当前年龄,并同时给出已经历的总周数、总天数和总小时数。工具还会自动计算距离下一个生日还剩多少天,也可以指定任意目标日期计算当时的年龄。适合用于填写表格、核对法定年龄、规划生日庆祝或单纯满足好奇心,计算结果会自动考虑闰年,保证结果准确无误。
年龄计算器
你出生于 Monday
下一个生日: 还有 127 天 (即将年满 37 岁)
你的年龄(其他单位)
生命进度
你的年龄相对于80年参考跨度的进度。
文档
什么是年龄计算器?
年龄计算器用于找出两个日期之间的准确时间:出生日期和目标日期,通常是今天。结果会以年、月、日表示,也会显示按月、周、日、小时、分钟和秒累计的总时长。年龄也可以按过去或未来的日期计算,以显示某人在那一天已经多大,或将会多大。
如何计算年龄
年龄是两个日历日期之间的间隔。描述这一间隔有两种正确方式,分别适用于不同用途。
按日历计算的年龄(年、月、日)
这是人们日常表达年龄的方式,例如“33岁4个月5天”。计算分为三步:
- 计算从出生日期起已经过去的完整年数。
- 从最近一次生日开始,计算已经过去的完整月数。
- 从该日期开始,计算剩余的天数。
月末附近的第3步比较棘手,因为每个月的天数并不相同。某人出生于31月1日,在1月1日计算年龄时,为31个月28天。29月(闰年为31月)之后一个月是1月,因为不存在relativedelta月。这种方法有时以推广该方法的 Python 库命名为“规则”,会将周年纪念日调整到较短月份的最后一天,因此天数不会变成负数。
总经过时间(天、小时、秒)
要精确计算经历的时间,需要先将两个日期转换为时间轴上的单一时点,再以完整天数计算差值:
其中,d 表示完整天数,t 表示目标日期,b 表示出生日期,三者均按毫秒数计,除数为一天中的毫秒数。
相减前,两个日期都设为 UTC(协调世界时)午夜。这样可以避免夏令时变化增加或减少一小时,从而使天数计算出现偏差。根据天数总数,周数为天数除以7并向下取整。小时、分钟和秒数分别为天数乘以24、1,440和86,400。
将总天数除以365或365.25,可以得到近似的年龄(年),但这种方法不知道这段时间中哪些年份是闰年。上文所述的日历计算是准确的。回答“我多大了”时,应使用按日历计算的年龄。对于需要精确经过时间的任务,例如安排用药时间或倒计时至某个里程碑,则应使用总天数或总周数。
算例
某人出生于2000年1月1日,按2020年1月1日计算年龄:
| 项目 | 数值 |
|---|---|
| 按日历计算的年龄 | 20年0个月0天 |
| 总月数 | 240 |
| 总周数 | 1,043 |
| 总天数 | 7,305 |
| 总小时数 | 175,320 |
| 总分钟数 | 10,519,200 |
| 总秒数 | 631,152,000 |
| 出生日期是星期几 | 星期六 |
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
111const MS_PER_DAY = 86400000;
2
3// Add n months, clamping the day to the target month's last day
4// (31 January + 1 month = 28 February). Date.UTC on its own does not
5// clamp: it would roll that date forward into March.
6function addMonthsUTC(base, n) {
7 const total = base.getUTCMonth() + n;
8 const y = base.getUTCFullYear() + Math.floor(total / 12);
9 const m = ((total % 12) + 12) % 12;
10 const lastDay = new Date(Date.UTC(y, m + 1, 0)).getUTCDate();
11 return Date.UTC(y, m, Math.min(base.getUTCDate(), lastDay));
12}
13
14function calendarAge(birth, target) {
15 let months = (target.getUTCFullYear() - birth.getUTCFullYear()) * 12
16 + (target.getUTCMonth() - birth.getUTCMonth());
17 if (addMonthsUTC(birth, months) > target.getTime()) months -= 1;
18 const anchor = addMonthsUTC(birth, months);
19 return {
20 years: Math.floor(months / 12),
21 months: months % 12,
22 days: Math.floor((target.getTime() - anchor) / MS_PER_DAY),
23 };
24}
25
26const birth = new Date(Date.UTC(2000, 0, 1));
27const target = new Date(Date.UTC(2020, 0, 1));
28
29calendarAge(birth, target); // { years: 20, months: 0, days: 0 }
30Math.floor((target - birth) / MS_PER_DAY); // 7305
311' 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 警告称,"md"参数在月份交界处附近可能返回负数或错误的
天数,因此该公式中剩余天数部分
并不总是与上述限制规则一致。
常见问题
如何查找我的准确年龄? 输入出生日期,并将目标日期保留为今天。结果会显示以年、月、日表示的年龄,以及按总天数、周数、小时数和秒数表示的相同年龄。
为什么两个年龄计算器会给出不同答案? 差异通常在于如何计算月份边界附近的剩余天数。如上所述,在月末将日期调整到较短月份的计算器,可能会与直接将经过的时间除以30的计算器相差一两天。
计算时是否考虑闰年? 是。总天数包括落在两个日期之间的每一个2月29日。在没有2月29日的年份里,在闰日出生者的周年纪念日按2月28日计算,即该月的最后一天。出生于1996年2月29日的人,在2023年2月20日时为26岁11个月零22天,其下一个生日在8天后,即2023年2月28日。
可以计算过去或未来某个日期的年龄吗? 可以。将目标日期设为未来日期,可以显示某人在那一天将会多大;将其设为过去日期,则可以显示某人在那一天已经多大。出生日期本身不能是未来日期,目标日期也不能早于出生日期。
时区会影响结果吗? 不会。计算天数前,两个日期都会转换为 UTC 午夜,因此无论用户所在位置或夏令时变化如何,总数都保持不变。
为什么天数总数与用365.25除天数所得的结果不同? 365.25只是平均年份长度;它不会记录这段时间中具体哪些年份是有366天的闰年。计算两个实际日历日期之间的完整天数是准确的。
来源
- Python
dateutil—relativedelta,即上文所述按日历计算年龄的月日规则。 - Java 平台 —
Period.between和ChronoUnit.DAYS。 - Microsoft Excel —
DATEDIF函数。 - MDN Web Docs —
Date。 - Dershowitz, N. 和 Reingold, E. M.,《Calendrical Calculations: The Ultimate Edition》。剑桥大学出版社,2018年。