PDA

Ver la Versión Completa : como calcular la edad de un usuario


ajum
24-07-2003, 18:21:42
Hola,

Quisiera saber como calcular la edad de un usuario, he leido algunas respuestas y puedo ver que se resta el año actual con al año del nacimiento del usuario y asi tengo la edad, mi problema es que no se con que funcion tomar el año actual y como tomar el año de nacimiento del usuario ya que en el campo de mi BD esta con el siguiente formato 18/05/1977.

Despues de esto necesito es guardarlo en una variable, para asi mostrarlo con un Showmessage.

Bueno,

Saludos,
Ajum.

delphi.com.ar
24-07-2003, 18:26:21
Restar años no es una solución válida para calcular edades. Proque no es lo mismo alguien que nació el 1/1/1980 con alguien del 1/05/1980, pese que pertenecen al mismo año si lo comparas el 1/4 del 1/6.

Edad := Trunc((Date - FechaNacimiento) / 365.25)

jachguate
25-07-2003, 02:33:25
Lo que te dice delphi.com.ar sera un buen aproximado, pero la edad exacta la obtenes con:


Function Edad(FechaNacimiento : TDateTime) : Integer;

Var
an, mn, dn : Word;
ahoy, mhoy, dhoy : Word;

Begin
DecodeDate(FechaNacimiento, an, mn, dn);
DecodeDate(Now, ahoy, mnoy, dhoy);
if (mhoy * 100 + dhoy) > (mn * 100 + dn)
Then Result := an - dn
else
Result := an - dn + 1;
End;


hasta luego

;)

marcoszorrilla
25-07-2003, 10:56:21
Según mis cálculos no funciona, yo le haría los siguientes cambios.


procedure TForm1.Button1Click(Sender: TObject);
var
Nacimiento:Tdate;
begin
nacimiento:=EncodeDate(1975,7,1);
ShowMessage(IntToStr(Edad(nacimiento)));
end;

Function Edad(FechaNacimiento : TDate) : Integer;
Var
an, mn, dn : Word;
ahoy, mhoy, dhoy : Word;
Begin
DecodeDate(FechaNacimiento, an, mn, dn);
DecodeDate(Now, ahoy, mhoy, dhoy);

If (mn > mhoy) or((mn = mhoy) and (dn > dhoy)) then
Result:=ahoy - an - 1
else
Result:=ahoy - an;
End;



Un Saludo.

delphi.com.ar
25-07-2003, 15:55:11
Bueno, me han herido la moral :D , y por eso hice esta comprobación:
function DelphiComAr(AFechaNacimiento: TDateTime) : Integer;
begin
Result := Trunc((Date - AFechaNacimiento) / 365.25);
end;

function JachGuate(FechaNacimiento : TDateTime) : Integer;
var
an, mn, dn : Word;
ahoy, mhoy, dhoy : Word;
begin
DecodeDate(FechaNacimiento, an, mn, dn);
DecodeDate(Now, ahoy, mhoy, dhoy);
if (mhoy * 100 + dhoy) > (mn * 100 + dn) Then
Result := an - dn
else
Result := an - dn + 1;
end;

function MarcosZorrilla(FechaNacimiento : TDate) : Integer;
Var
an, mn, dn : Word;
ahoy, mhoy, dhoy : Word;
Begin
DecodeDate(FechaNacimiento, an, mn, dn);
DecodeDate(Now, ahoy, mhoy, dhoy);

If (mn > mhoy) or((mn = mhoy) and (dn > dhoy)) then
Result:=ahoy - an - 1
else
Result:=ahoy - an;
End;


procedure TForm1.Button1Click(Sender: TObject);
var
ADate : TDateTime;
i,
ADelphi,
AJach,
AMarcos: Integer;
begin
ADate := StrToDate('01/01/1900');
repeat
ADelphi := DelphiComAr(ADate);
AJach := JachGuate(ADate);
AMarcos := MarcosZorrilla(ADate);
{He comentado la comprobación de la funcion JachGuate}
if {(ADelphi <> AJach) or} (ADelphi <> AMarcos) {or (AJach <> AMarcos) }Then
Memo1.Lines.Add(Format('%s - Delphi.com.ar: %4d JachGuate: %4d MarcosZorrilla: %4d', [DateToStr(ADate), ADelphi, AJach, AMarcos]));
ADate := ADate + 1;
until ADate > Date;
end;


Conclusión: La función de JachGuate evidentemente esta mal, o yo tengo 1996 años :D, y la de Marcos difiere de la mía en un pequeño detalle, en mi función que es mucho mas sencilla, el día del cumpleaños aún no a sumado un año, en la de marcos el día del cumpleaños ya se ha sumado un año, bueno eso queda a elección del programador.
Si la comprobación se extiende a fechas muy antiguas, falla constantemente, ninguna de las funciones tiene en cuenta el desfasaje del calendario.

Saludos

marcoszorrilla
25-07-2003, 18:51:42
Había probado la de JachGuate, y me fuí corriendo a mirar al espejo, porque tenía más de mil años.

La tuya no había llegado a hacer la prueba, pero me parecía que con la rectificación para los bisiestos no iba a funcionar en algún momento.

Sin embargo, despues de la prueba que propones, me quedo con la tuya, está dentro de mi filosofía, la mejor función es la que emplea menos código.

Bueno en cuanto a la diferencia de un año, como habrás observado yo entiendo que el día del cumpleaños ya se tienen los años cumplidos.

Un Saludo.

jachguate
25-07-2003, 23:45:26
Que tal. Me he dado cuenta del error que cometí, la función funcionaría correctamente asi:


Function Edad(FechaNacimiento : TDateTime) : Integer;

Var
an, mn, dn : Word;
ahoy, mhoy, dhoy : Word;

Begin
DecodeDate(FechaNacimiento, an, mn, dn);
DecodeDate(Now, ahoy, mnoy, dhoy);
if (mhoy * 100 + dhoy) >= (mn * 100 + dn)
Then Result := ahoy - an
else
Result := ahoy - an - 1
End;


Hasta luego

ajum
29-07-2003, 17:41:31
Una vez mas yo, quiero contarles que me fue muy bien con sus sugerencias, me funcionaron perfectamente segun mi necesidad, el motivo de mi retraso fue una vez mas mi computador, pero eso ya esta solucionado y creo que no volvera a molestar.

Saludos

:D :D :D