返回博客
2 min read

如何在 Python 中计算年龄(datetime 和 dateutil 示例)

了解如何在 Python 中根据出生日期计算年龄。包括完成年份、截至特定日期的年龄以及闰年和时区等常见陷阱。

如何在 Python 中计算年龄(datetime 和 dateutil 示例)

如何在 Python 中计算年龄(datetime 和 dateutil 示例)

如果您需要用Python计算年龄从出生日期开始,最重要的是要正确定义年龄:大多数应用程序都需要完成年数(完整的生日),而不仅仅是年份之间的差异。

1) 完成年数(安全定义)

这将返回自出生日期 (DOB) 以来的整年数。如果当年尚未过生日,则减 1。

from datetime import date

def age_years(dob: date, as_of: date | None = None) -> int:
    if as_of is None:
        as_of = date.today()
    years = as_of.year - dob.year
    before_birthday = (as_of.month, as_of.day) < (dob.month, dob.day)
    return years - 1 if before_birthday else years

print(age_years(date(2000, 10, 5), date(2026, 2, 26)))

2) 截至特定日期的年龄(不仅仅是今天)

许多用例需要“截至”日期:保险定价、资格检查、学校截止日期、报告。上面的功能已经支持它通过as_of

3)精确样式输出(年和月)

如果您想要类似“25 年 4 个月”的输出,请使用dateutil.relativedelta(它正确处理月份长度)。

from datetime import date
from dateutil.relativedelta import relativedelta

def age_ym(dob: date, as_of: date | None = None):
    if as_of is None:
        as_of = date.today()
    rd = relativedelta(as_of, dob)
    return rd.years, rd.months

print(age_ym(date(2000, 10, 5), date(2026, 2, 26)))

4)常见陷阱(以及如何避免)

  • 闰日生日:决定如何对待非闰年的 2 月 29 日。许多系统使用 2 月 28 日或 3 月 1 日。库行为很重要,因此请对其进行测试。
  • 日期时间和时区:对于 DOB,更喜欢date超过datetime。如果必须使用日期时间,请首先标准化为同一时区。
  • 未来的 DOB 或缺失值:验证输入以避免负老化或崩溃。

快速检查(无代码)

如果您只需要快速得到一个结果,请使用在线计算器:在线计算年龄

相关指南

常问问题

为什么 (today.year - dob.year) 有时会出错?

因为它忽略了今年的生日是否已经发生。您必须在生日之前减 1。

我应该使用日期时间还是日期作为出生日期?

使用date如果可能的话。 DOB 是一个日历日,时区可以在几天内改变日期时间。