跳至内容

年龄计算器 — 精确年龄(年、月和天)

年龄计算器只需输入出生日期,即可精确算出以年、月、日表示的当前年龄,并同时给出已经历的总周数、总天数和总小时数。工具还会自动计算距离下一个生日还剩多少天,也可以指定任意目标日期计算当时的年龄。适合用于填写表格、核对法定年龄、规划生日庆祝或单纯满足好奇心,计算结果会自动考虑闰年,保证结果准确无误。

年龄计算器

精确年龄
36 岁 7 个月 26 天

你出生于 Monday

下一个生日: 还有 127 天 (即将年满 37 岁)

你的年龄(其他单位)

个月
439
周
1,912
天
13,387
小时
321,288
分钟
19,277,280
秒
1,156,636,800

生命进度

你的年龄相对于80年参考跨度的进度。

年龄可视化3636 / 80 岁080
加载计算器...
📚

文档

什么是年龄计算器?

年龄计算器用于找出两个日期之间的准确时间:出生日期和目标日期,通常是今天。结果会以年、月、日表示,也会显示按月、周、日、小时、分钟和秒累计的总时长。年龄也可以按过去或未来的日期计算,以显示某人在那一天已经多大,或将会多大。

如何计算年龄

年龄是两个日历日期之间的间隔。描述这一间隔有两种正确方式,分别适用于不同用途。

按日历计算的年龄(年、月、日)

这是人们日常表达年龄的方式,例如“33岁4个月5天”。计算分为三步:

  1. 计算从出生日期起已经过去的完整年数。
  2. 从最近一次生日开始,计算已经过去的完整月数。
  3. 从该日期开始,计算剩余的天数。

月末附近的第3步比较棘手,因为每个月的天数并不相同。某人出生于31月1日,在1月1日计算年龄时,为31个月28天。29月(闰年为31月)之后一个月是1月,因为不存在relativedelta月。这种方法有时以推广该方法的 Python 库命名为“规则”,会将周年纪念日调整到较短月份的最后一天,因此天数不会变成负数。

总经过时间(天、小时、秒)

要精确计算经历的时间,需要先将两个日期转换为时间轴上的单一时点,再以完整天数计算差值:

d=⌊t−b86400000⌋d = \left\lfloor \frac{t - b}{86400000} \right\rfloor

其中,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
11

Microsoft 警告称,"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天的闰年。计算两个实际日历日期之间的完整天数是准确的。

来源

  1. Python dateutil — relativedelta,即上文所述按日历计算年龄的月日规则。
  2. Java 平台 — Period.between和ChronoUnit.DAYS。
  3. Microsoft Excel — DATEDIF函数。
  4. MDN Web Docs — Date。
  5. Dershowitz, N. 和 Reingold, E. M.,《Calendrical Calculations: The Ultimate Edition》。剑桥大学出版社,2018年。