Delphi Рассчитать возраст человека из компонента TDateEdit - PullRequest
0 голосов
/ 27 мая 2019

У меня очень простая форма с компонентами TDateEdit, TButton и TLabel. enter image description here

Каков наилучший способ узнать возраст кого-либо, если указана дата его рождения? Как кто-то может сделать это в Delphi из компонента TDateEdit, а затем отобразить возраст на ярлыке?

Может быть, есть встроенная функция или что-то, что я могу использовать, чтобы узнать возраст кого-либо из даты его рождения в компоненте? Я ищу самый простой, легкий и лучший способ сделать это.

Ответы [ 3 ]

8 голосов
/ 27 мая 2019

Вот функция для подсчета чьего-либо возраста.

Она заметно отличается от функции 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;
2 голосов
/ 27 мая 2019

Вы можете использовать функцию YearsBetween () из модуля System.DateUtils, чтобы вычислить количество лет между сегодняшним днем ​​(которое вы получаете из функции сейчас) и датой в вашем TDateEdit компоненте, которую вы получаете из датысобственность.

Label1.Text:= Trunc(YearsBetween(Now,DateEdit1.Date)).toString;
0 голосов
/ 28 мая 2019

Я предпочитаю ответ Яна Бойда, но для тех, кто настаивает на том, что YearsBetween - это путь, вот альтернатива.

Если Y является результатом YearsBetween, то правильный результат будет либо Y, либо Y + 1.Эта процедура вызывает YearsBetween и возвращает Y + 1.Затем он использует IncYear, чтобы увидеть, слишком ли велик ответ.Если это так, он возвращает Y.

Может показаться, что это проще, но за кулисами происходит гораздо больше работы.Ответ Иана Бойда - это тот, который вы должны использовать.

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;
...