Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Tablas planas (https://www.clubdelphi.com/foros/forumdisplay.php?f=20)
-   -   como calcular la edad de un usuario (https://www.clubdelphi.com/foros/showthread.php?t=2468)

ajum 24-07-2003 18:21:42

como calcular la edad de un usuario
 
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:

Código:

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.

Código:

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:
Código:

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:

Código:

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


La franja horaria es GMT +2. Ahora son las 09:44:06.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi