PDA

Ver la Versión Completa : Problemas al calcular días entre enero y febrero


tiqui_loquito
22-03-2019, 17:15:17
Buenos días

Tengo el siguiente problema.

Cuando calculo los días de vida de una persona entre las fechas 31/01/2019 y el día 12/02/2019 la función me retorna 9 días, sin embargo la persona de acuerdo al calendario tiene 12 Días.

Creo que debo modifica la línea


Dia:=DD+MonthDays[IsLeapYear(AA),MM]-D;
Mes := Mes -1;


Pero que sugerencias o ideas me pueden dar para solucionar este problemita.

Muchas gracias

La función que aplico es la siguiente (La he tomado de los foros de club delphi)


function CalculaEdadCompleta(Fecha:TDateTime):String;
var A, AA, M, MM, D, DD: Word;
Anio, Mes, Dia: double;
begin
DecodeDate(Fecha, A, M, D);
DecodeDate(Date, AA, MM, DD);
Anio := Int(AA - A);
if( M <= MM ) then
Mes := MM - M
else
begin
Mes := MM+12-M;
Anio := Anio -1;
end;
if( D <= DD ) then
Dia := DD - D
else
begin
Dia:=DD+MonthDays[IsLeapYear(AA),MM]-D;
Mes := Mes -1;
end;
if Mes < 0 then
begin
Anio := Anio - 1;
Mes := 12 + Mes;
end;
Result := Format('Años: %.0f, Meses: %.0f, Dias: %.0f', [Anio, Mes, Dia]);
end;

dec
22-03-2019, 18:08:22
Hola a todos,

Tal vez quieras usar la función "DaysBetween" de la unidad "DateUtils" como en el código de abajo: *


uses
DateUtils;

procedure TForm1.Button1Click(Sender: TObject);
var
Fromdate, ToDate : TDateTime;
begin
Fromdate := EncodeDateTime(2019, 01, 31, 0, 0, 0, 0);
ToDate := EncodeDateTime(2019, 02, 12, 0, 0, 0, 0);

ShowMessageFmt('Total de días de diferencia: %d', [DaysBetween(ToDate, Fromdate)]);
end;


* Tomado de Delphi Basics (http://www.delphibasics.co.uk/RTL.asp?Name=DaysBetween)

tiqui_loquito
22-03-2019, 18:26:27
Buena tarde dec

Gracias por tu pronta respuesta.

La función que te uso la realizo para calcular la edad respecto a la fecha de nacimiento de un usuario y la fecha en que se esta creando dicho paciente. El calculo lo hace bien para meses y años. El problema se encontró en el caso puntual que mencione, el cual el paciente nació el 1 de enero y lo estaban registrando el 12 de febrero y le ponía 9 días.

Ahora, con respecto a lo que me dices, sería usarla cuando los años y los meses sean ceros?, de esa manera lo entiendo.

Gracias

dec
22-03-2019, 18:41:00
Hola a todos,

La función "EncodeDateTime" te permite conformar una variable "TDateTime", que, es la que requiere después "DaysBetween", por ejemplo. Los argumentos de la variable "EncodeDateTime" son, por este orden, año, mes, día, hora, minuto, segundo y milisegundo. En el caso de arriba se dejan en cero la hora, minuto, segundo y milisegundo, porque, no los he considero relevantes para el caso que nos ocupa. Evidentemente, tú puedes usar "EncodeDateTime" con los argumentos que precises.

No estoy seguro si esto responde tu duda o no...

tiqui_loquito
22-03-2019, 21:03:52
Gracias David Esperalta

Realice la siguiente modificación al código y me retorna los días cuando solo no ha transcurrido ni un mes


if( DDI <= DDF ) then
DD := DDF - DDI
else
begin
DD := DDF + MonthDays[IsLeapYear(AAF),MMF] - DDI;
MM := MM - 1;

if MM = 0 then
DD:= DaysBetween(FechaI, FechaF)
end;

tiqui_loquito
22-03-2019, 21:07:35
Puedo dar el tema por resuelto.

Gracias a David Esperalta he resuelto mi duda, muchas gracias.

Espero este hilo le sea de ayuda a otras personas.^\||/

Casimiro Notevi
22-03-2019, 21:22:04
Puedo dar el tema por resuelto.
Gracias a David Esperalta he resuelto mi duda, muchas gracias.
Espero este hilo le sea de ayuda a otras personas.^\||/
Es que David Esperalta es uno de los maestros de clubdelphi :)

tiqui_loquito
22-03-2019, 21:57:34
Es que David Esperalta es uno de los maestros de clubdelphi :)

Es muy cierto casimiro, igual que tu, efecsia y otros más.

Gracias por colaborar siempre:D^\||/

Casimiro Notevi
23-03-2019, 01:18:26
Es muy cierto casimiro, igual que tu, efecsia y otros más.
Gracias por colaborar siempre:D^\||/


Sí, ecfisa también, yo no, yo sigo siendo un viejo novato :D

dec
23-03-2019, 08:51:33
Hola a todos,

Tampoco nos pasemos... ¡que lo saqué de Delphi Basics (http://www.delphibasics.co.uk/RTL.asp?Name=DaysBetween)! :D :D :D

Casimiro Notevi
23-03-2019, 10:46:25
Bueno, casi más importante que saber, es saber dónde encontrar la solución :)

roman
26-03-2019, 14:02:34
Bueno, casi más importante que saber, es saber dónde encontrar la solución :)

JBx4xQeNbmw

// Saludos

Casimiro Notevi
26-03-2019, 17:02:27
// Saludos ;)
La peli es un pelín viejita, como alguno como yo me sé.

escafandra
27-03-2019, 22:46:59
Como curiosidad y conociendo como se interpreta el Tipo TDateTime de delphi, la diferencia en días entre dos fechas puede calcularse también de esta forma, restando la parte entera:


Dias:= Ceil(Date2) - Ceil(Date1);




Saludos.

Casimiro Notevi
27-03-2019, 22:50:41
Efectivamente, una fecha es un número con decimales, la parte entera es el día y la parte decimal es la hora.
Así que se puede hacer cálculos con ellos como con cualquier otro número.