Delphi 从 TDateEdit 组件计算人的年龄

Delphi Calculate age of person from TDateEdit component

我有一个非常简单的表单,其中包含 TDateEditTButtonTLabel 组件。

如果给定的日期是某人的生日,那么获取某人年龄的最佳方法是什么?有人会如何在 TDateEdit 组件的 Delphi 中执行此操作,然后在标签中显示年龄?

组件中是否有内置函数或可用于从某人的出生日期获取其年龄的东西?我正在寻找最简单、最容易和最好的方法来做到这一点。

您可以使用 System.DateUtils 单元中的函数 YearsBetween() 来计算今天(您现在从函数中获得)和 TDateEdit 组件中的日期之间的年数,你从日期 属性.

得到的
Label1.Text:= Trunc(YearsBetween(Now,DateEdit1.Date)).toString;

这是一个计算某人年龄的函数。

它与RTL函数YearsBetween明显不同,因为它计算两个日期之间的年数;并且从根本上与某人的年龄不同。

function GetAge(const BirthDate, CurrentDate: TDateTime): Integer;
var
    y1, m1, d1: Word; //born
    y2, m2, d2: Word; //today
begin
    Result := 0;

    if CurrentDate < BirthDate then
        Exit;

    DecodeDate(BirthDate, y1, m1, d1);
    DecodeDate(CurrentDate, y2, m2, d2);

    //Fudge someone born on the leap-day to Feb 28th of the same year
    //strictly for the purposes of this calculation
    if ( (m1=2) and (d1=29) )
            and
        ( not IsLeapYear(y2) ) then
    begin
        d1 := 28;
    end;

    Result := y2-y1; //rough count of years
    //Take away a year of the month/day is before their birth month/day
    if (m2 < m1) or
            ((m2=m1) and (d2<d1)) then
        Dec(Result);
end;

我更喜欢 Ian Boyd 的回答,但对于那些坚持认为 YearsBetween 是可行方法的人来说,这里有一个替代方案。

如果 Y 是 YearsBetween 的结果,则正确的结果是 Y 或 Y+1。此例程调用 YearsBetween 和 returns Y+1。然后它使用 IncYear 查看答案是否太大。如果是,那就returnsY。

这可能看起来更简单,但在幕后还有很多工作要做。 Ian Boyd 的答案是您应该使用的答案。

function AgeInCompleteYears ( const nBirthDate   : tDateTime;
                              const nCurrentDate : tDateTime  ) : integer;
begin
  Result := 1 + DateUtils.YearsBetween ( nCurrentDate, nBirthDate );
  if DateUtils.IncYear ( nBirthDate, Result ) > nCurrentDate then
    dec ( Result );
end;
function GetAge(BirthDate:TDateTime; RefDate:TDateTime=0):Integer;
begin
  if RefDate=0 then RefDate:= Today;
  Result := Trunc((RefDate- BirthDate) / 365.25)
end;