![]() |
![]() |
![]() |
![]() |
![]() |
FTP | ![]() |
![]() |
CCD | ![]() |
![]() |
Buscar | ![]() |
![]() |
Trucos | ![]() |
![]() |
Trabajo | ![]() |
![]() |
Foros | ![]() |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
![]() |
|
Herramientas | Buscar en Tema | Desplegado |
|
#1
|
|||
|
|||
![]() 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. |
#2
|
||||
|
||||
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)
__________________
delphi.com.ar Dedique el tiempo suficiente para formular su pregunta si pretende que alguien dedique su tiempo en contestarla. ![]() |
#3
|
||||
|
||||
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; ![]()
__________________
Juan Antonio Castillo Hernández (jachguate) Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate |
#4
|
||||
|
||||
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; Última edición por marcoszorrilla fecha: 25-07-2003 a las 12:41:49. |
#5
|
||||
|
||||
Bueno, me han herido la moral
![]() 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; ![]() Si la comprobación se extiende a fechas muy antiguas, falla constantemente, ninguna de las funciones tiene en cuenta el desfasaje del calendario. Saludos
__________________
delphi.com.ar Dedique el tiempo suficiente para formular su pregunta si pretende que alguien dedique su tiempo en contestarla. ![]() Última edición por delphi.com.ar fecha: 25-07-2003 a las 15:57:36. |
#6
|
||||
|
||||
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. |
#7
|
||||
|
||||
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;
__________________
Juan Antonio Castillo Hernández (jachguate) Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate |
#8
|
|||
|
|||
![]() 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 ![]() ![]() ![]() |
![]() |
|
|
![]() |
|