Delphi Рассчитать возраст человека из компонента TDateEdit

У меня очень простая форма с компонентами TDateEdit, TButton и TLabel. Delphi Рассчитать возраст человека из компонента TDateEdit

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

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

Будьте осторожны, используя функцию ГодыМежду, так как она может сказать, что кому-то 18 лет, хотя на самом деле ему все еще 17.

Ian Boyd 27.05.2019 19:29

@IanBoyd Когда он покажет 18, когда на самом деле человеку все еще 17?

user4559241 28.05.2019 08:51
«Так, например, YearsBetween сообщает о разнице между 1 января и 31 декабря как 0 в невисокосные годы и 1 в високосные годы». Замените 1 января 17 лет назад, а сегодня 31 декабря високосного года, и у вас есть 17-летний возраст, который считается 18-летним. Это похоже на функцию SQL Server datediff; он считает номер интервала переходы, а не разницу дат.
Ian Boyd 28.05.2019 14:57

YearsBetween просто делит период между параметрами на 365,25 дня. Во многих крайних случаях это не сработает, когда приближается день рождения. Рассмотрим человека, которому сегодня, 28 мая 2019 г., исполнилось 18 лет, родившегося 28 мая 2001 г. YearsBetween берет возраст в днях, 6574, и делит на 365,25, чтобы получить 17,9986310746064, и возвращает 17. Ответ Яна Бойда даст правильный результат.

David Dubois 28.05.2019 16:14

Вычесть один год из другого. Вычтите единицу, если дата в течение года не наступила.

David Heffernan 28.05.2019 21:32

Я не понимаю, какое это имеет отношение к firemonkey?

J... 29.05.2019 17:05

@J... TDateEdit - это компонент FireMonkey.

Shaun Roselt 02.06.2019 00:44
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
7
1 984
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

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

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

Вы не можете использовать YearsBetween для вычисления возраста человека. Пожалуйста, смотрите мой комментарий выше.

David Dubois 28.05.2019 16:37
Ответ принят как подходящий

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

Она заметно отличается от функции RTL ГодыМежду, поскольку вычисляет количество лет между двумя датами; и принципиально не совпадает с чьим-то возрастом.

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;

Это вовсе не кажется самым простым и легким способом.

user4559241 28.05.2019 09:02

@kobik Может быть, это только код, но есть комментарии, которые довольно четко объясняют функциональность, я бы, наверное, просто добавил, зачем использовать эту функцию вместо YearsBetween.

Triber 28.05.2019 11:59

Я предпочитаю ответ Яна Бойда, но для тех, кто настаивает на том, что 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;
function GetAge(BirthDate:TDateTime; RefDate:TDateTime=0):Integer;
begin
  if RefDate=0 then RefDate:= Today;
  Result := Trunc((RefDate- BirthDate) / 365.25)
end;

Каково предназначение ".25"?

MartynA 07.01.2020 23:41

@MartynA Я предполагаю, что это связано с високосным днем ​​(29 февраля), который существует только каждые 4 года.

Marc Guillot 08.01.2020 08:46

Привет @MarcGuillot. Да, я думал, что это может быть что-то в этом роде, но это, кажется, упускает из виду тот факт, что не каждый четвертый год является високосным. В любом случае, давайте послушаем, что скажет ОП.

MartynA 08.01.2020 10:25

Другие вопросы по теме