Delphi - Convertir número entero a años, meses y días

 
Vista:
sin imagen de perfil
Val: 38
Ha mantenido su posición en Delphi (en relación al último mes)
Gráfica de Delphi

Convertir número entero a años, meses y días

Publicado por Ciclope (27 intervenciones) el 22/05/2021 14:53:26
Hola.
Pues eso, quiero convertir número entero a años, meses y días

Por ejemplo: 2355 días ¿Cuántos años, meses y días son?
2355 = X años, X meses y X días

Gracias.
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
sin imagen de perfil
Val: 65
Oro
Ha mantenido su posición en Delphi (en relación al último mes)
Gráfica de Delphi

Convertir número entero a años, meses y días

Publicado por Ezequiel (1244 intervenciones) el 22/05/2021 18:04:34
No es algo exacto, puesto que hay años bisiestos y meses de 30, 31, 28 y 29 días, pero algo así es:

1
2
3
4
5
6
7
8
9
10
11
12
2355 / 365 = 6.452 años
0.452 * 12 = 5.424 meses
0.424 * 30 = 12.72 días
 
resultado aproximado 6 años, 5 meses, 12.72 días
 
Si quisieras aproximarlo al resultado real tendrías que hacer esto:
6 * 365 = 2190 días
5 * 30 = 150 días
2355 - 2190 - 150 = 15 días
 
resultado 6 años, 5 meses, 15 días.
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
Val: 38
Ha mantenido su posición en Delphi (en relación al último mes)
Gráfica de Delphi

Convertir número entero a años, meses y días

Publicado por Ciclope (27 intervenciones) el 23/05/2021 13:00:43
Hola Ezequiel, muchas gracias por tu respuesta.
Ahora el problema es que el número de días se obtiene del campo de una BBDD, que se incrementa los días que ocurre un determinado evento, y en la ejecución del programa no se sabe los días que son, y no sé cómo se obtiene la parte decimal de un número en Delphi.

¿Hay alguna función en Delphi que devuelva la parte decimal de un número?
Con lo que me has dado llego hasta aquí.

1
2
3
4
5
6
7
8
9
function GET_AnosMesesDias(dias: integer): string;
var nAnos,nMeses,nDias: Integer;
begin
nAnos := (DataM.Table.FieldByName('NumDias').AsInteger / 365);
nMeses := ? // la parte decimal de lo anterior ;
nDias  := ?;
 
result := IntToStr(nAnos) + ' años, ' + IntToStr(nMeses) + ' meses y ' + IntToStr(nDias) + ' días';
end;

No es necesario que sea exacto, con lo que me has dado ya me vale.
Muchas 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
sin imagen de perfil
Val: 65
Oro
Ha mantenido su posición en Delphi (en relación al último mes)
Gráfica de Delphi

Convertir número entero a años, meses y días

Publicado por Ezequiel (1244 intervenciones) el 24/05/2021 18:57:17
Tienes que usar variables tipo real, con punto decimal
La funcion trunc, te regresa la parte entera de un número

1
2
3
4
5
6
7
8
9
10
function GET_AnosMesesDias(dias: integer): string;
var nAnos,nMeses,nDias: real; //Tienes que usar variables tipo real, con punto decimal
   result: string;
begin
  nAnos := (DataM.Table.FieldByName('NumDias').AsInteger / 365);
  nMeses := (nAnos - trunc(nAnos)) * 12; // la parte decimal de lo anterior ;
  nDias  := (nMeses - trunc(nMeses)) * 30;
  result := IntToStr(trunc(nAnos)) + ' años, ' + FloatToStr(trunc(nMeses)) + ' meses y ' + FloatToStr(trunc(nDias)) + ' días';
  ShowMessage(result);
end;
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil
Val: 38
Ha mantenido su posición en Delphi (en relación al último mes)
Gráfica de Delphi

Convertir número entero a años, meses y días

Publicado por Ciclope (27 intervenciones) el 25/05/2021 12:28:32
Me funciona muy bien. Ha quedado así:

1
2
3
4
5
6
7
8
9
function GET_AnosMesesDias(TotDias: Integer):string; // TotDias es el campo de la table
var rAnos,rMeses,rDias: real;
begin
  rAnos := (TotDias / 365);
  rMeses := (rAnos - Trunc(rAnos)) * 12;
  rDias := (TotDias - Trunc(rAnos) * 365) - (Trunc(rMeses) * 30); // La parte final de tu primera respuesta para ajustar más el resultado
 
  Result := FloatToStr(Trunc(rAnos)) + ' años, ' + FloatToStr(Trunc(rMeses)) + ' meses y ' + FloatToStr(Trunc(rDias)) + ' días';
end;

Muchas gracias.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar