Delphi 从 TDateEdit 组件计算人的年龄
Delphi Calculate age of person from TDateEdit component
我有一个非常简单的表单,其中包含 TDateEdit
、TButton
和 TLabel
组件。
如果给定的日期是某人的生日,那么获取某人年龄的最佳方法是什么?有人会如何在 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;
我有一个非常简单的表单,其中包含 TDateEdit
、TButton
和 TLabel
组件。
如果给定的日期是某人的生日,那么获取某人年龄的最佳方法是什么?有人会如何在 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;