Delphi - Para los programdores-calcular la edad

 
Vista:

Para los programdores-calcular la edad

Publicado por emilo (78 intervenciones) el 19/04/2007 15:13:30
En este artículo muestro una variante de un método para calcular la edad de la persona la cual es muy utilizada en aplicaciones en base de datos. Esta variante evita que se hagan comprobaciones de mes y día para deducir la edad, valiéndose de la aritmética y tratando a las fechas como simples punto flotantes .

El código:

unit Datemap;

interface

uses
SysUtils,DateUtils;

function YearOld(ADate,CurrentDate : TDateTime) : Integer; stdcall; overload;
function YearOld(ADate : TDateTime) : Integer; stdcall; overload;

implementation

function YearOld(ADate,CurrentDate : TDateTime) : Integer;
var
aYear,aMonth,aDay : Word;
TempDate : TDateTime;
begin

aYear := YearOf(CurrentDate);
aMonth := MonthOf(ADate);
aDay := DayOf(ADate);

//se trata de convertir a una fecha válida
if TryEncodeDate(aYear,aMonth,aDay,TempDate) then
begin

//si la fecha actual es <= a la fecha conformada entonces ya cumplió años
if CurrentDate <= TempDate then
Result := YearOf(CurrentDate) - YearOf(ADate)
else Result := YearOf(CurrentDate) - YearOf(ADate) -1;
end
else Result := 0; // 0 sino puede convertir una fecha válida

end;

function YearOld(ADate : TDateTime) : Integer;
begin
Result := YearOld(ADate,Date);
end;

end.

Por razones de reutilización decidí poner el código dentro de una dll, y lo amplié sobrecargando la función para poder calcular la edad entre una fecha y la fecha actual y entre dos fechas cualesquiera. La idea es crear una fecha nueva tomando el mes y el día de la fecha de nacimiento y el año de la fecha actual

ejemplo:

fecha de nacimiento: 30/03/1990
Fecha actual:19/04/2007
Fecha conformada:30/03/2007

Esta función también corrige los problemas que puede provocar el año bisiesto, devolviendo 0 sino se puede convertir el 29/02/#### a una fecha válida.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:Para los programdores-calcular la edad

Publicado por nombre (106 intervenciones) el 19/04/2007 19:30:22
A partir de la versión 6 o 7 de Delphi hay una función ya hecha

YearsBetween( FechaActual, FechaNacimiento ) ;
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

YearBetween no es la solucion

Publicado por emilio (78 intervenciones) el 20/04/2007 14:40:59
Amigo, si le prestas atencion a esa funcion te daras cuenta que no funciona bien, pues calcula la diferencia en años entre dos fechas; osea hace una resta trivial entre los años.

ejemplo:

fecha de nacimiento: 17/05/1984
fecha actual: 20/04/2007

Que edad crees que devolveria TearBetween??? , pues claro que daria 23, pero no es asi pues el sujeto cumple en mayo y estamos en abrir todabia. Para solucionar esto es que cree esa funcion, pues el otro metodo ya esta por ahi en muchos ejemplo y es muy engorroso, ya que hay que comprobar meses y dias.

Si crees que la funcion te va ser utils has uso de ella pues mi intencion es compartirla con esta comunidad que tanto admiro.

Te agradece el comentario!!!.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:YearBetween no es la solucion

Publicado por nombre (106 intervenciones) el 20/04/2007 18:43:16
Me has hecho dudar y lo he vuelto a probar en Delphi7, y parece que YearsBetwenn funciona bien.

fecha de nacimiento: 17/05/1984
fecha actual: 20/04/2007

El resultado que me da es 22 que creo que es el correcto.

procedure TForm1.FormCreate(Sender: TObject);
var
dFechaNaci, dFechaHoy: TDateTime;
iEdad: integer;
begin
dFechaNaci := StrToDate('17-05-1984');
dFechaHoy := StrToDate('20-04-2007');
iEdad := YearsBetween(dFechaHoy, dFechaNaci);
ShowMessage(IntToStr(iEdad));
end;
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:YearBetween no es la solucion

Publicado por emilo (78 intervenciones) el 20/04/2007 19:50:32
Ok, el ejemplo indudablemente no era el correcto.

Ahora prueba entre estas dos fechas para que te des cuenta.

fecha de nacimiento: 21/04/1984
fecha actual: 20/04/2007

Con estas dos fechas deberia dar 23, pues ya a pasado un dia despues de su cumpleaños. Comprueba si es asi!!! :)

Suerte!!!!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

RE:YearBetween no es la solucion

Publicado por Jose Luis (157 intervenciones) el 20/04/2007 21:36:00
Particularmente realice la prueba con YearBetween y las fechas
fecha de nacimiento: 21/04/1984
fecha actual: 20/04/2007

y el resultado que me dio es de 22 cuando debe de ser 23
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

YearBetween si es la solucion

Publicado por nombre (106 intervenciones) el 20/04/2007 22:27:53
Pruebo con las fechas que me indicas:

fecha de nacimiento: 21/04/1984
fecha actual: 20/04/2007

y me da 22, por lo que es correcto

Calculas mal la edad, si nació el 21 de abril y hoy es 20 de abril, no ha pasado un dia su cumpleños, más bien le falta uno, hasta mañana no cumple 23, hoy tiene 22
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

YearsBetween

Publicado por nombre (106 intervenciones) el 21/04/2007 01:09:11
He encontrado porque dices que YearsBetween no es valido para calcular la edad.

La explicación la da el propio Delphi.

Returns the approximate number of years between two specified TDateTime values.

Call YearsBetween to obtain the difference, in years, between two TDateTime values. Because years are not all the same length (e.g. leap years), YearsBetween returns an approximation based on an assumption of 365.25 days per year. Fractional years are not counted. Thus, for example, YearsBetween reports the difference between Jan 1 and Dec 31 as 0 on non-leap years and 1 on leap years.

Por lo que tienes razón, no es exacto.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:YearsBetween

Publicado por emilo (78 intervenciones) el 23/04/2007 14:47:12
Gracias por darte cuenta y perdona mis ejemplos, es que estaba con mi novia atormentandome por lo de su tesis y no podia concentrarme, ya sabes...
Para la otra prometo ser mas consizo, vale!!!.

Oye podes utilizar esa funcion que publique, si la comparas con otras que hay en sitio de CodeGear veras que el metodo es mas sencillo y eficas.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Para los programdores-calcular la edad

Publicado por Sizne (3 intervenciones) el 25/01/2010 23:19:46
Hola. Por favor pueden ayudarme a sacar la edad a partir de: Introduciendo los datos de su fecha de nacimiento en un DBEdit1 y quisiera que en otro DBEdit2 me salga la edad actual, sin necesidad de hacer click en el campo de DBEdit2.

Es decir en DBEdit1 introduciré <-- 15/02/1950 ya estara con este formato __/__/____ además elcampo DBEdit1 ya estara con formato de la tabla en años.

y en el campo de DBEdit2 en el formulario aparezca la edad.

Gracias!!!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar