PDA

Ver la Versión Completa : Calcular dias entre 2 fechas.


Bluefox
29-11-2017, 13:23:30
Buenas...
Necesito calcular la fecha entre 2 fechas, pero en base 365. Quiero decir, sin contar los años bisiestos.

Por ejemplo
entre 29/11/2017 y el 29/11/2020 el days between o la resta entre fechas, nos da 1096 días, cuando necesitaría 1095.

alguna idea? gracias.

Casimiro Notevi
29-11-2017, 13:38:23
¿Y los meses que tienen 30 o 31 cómo los cuentas?
Si vas a fijar los días en 365, entonces contarás que cada mes tiene 365/12=30,416666667 días.

Bluefox
29-11-2017, 13:48:19
Pues en principio es como si no existiera el 29 de febrero.
Enero 31, Febrero 28, Marzo 31.... etc.
No sirve el valor medio :(

Casimiro Notevi
29-11-2017, 13:53:39
Pues hazlo normalmente con DaysBetween y luego restas un día si es año bisiesto.

Bluefox
29-11-2017, 14:00:04
Debería de saber si entre las fechas, hay algun bisiesto y restarle el numero de bisiestos.
Quiero decir:
29/11/2017 y el 29/11/2020 el days between o la resta entre fechas, nos da 1096 días, cuando necesitaría 1095.
29/11/2017 y el 28/02/2020 el days between o la resta entre fechas, nos da 821 días Que seria correcto.


entre el 01/01/2020 y el 28/01/2020 hay 58 días.
entre el 01/01/2020 y el 01/03/2020 hay 60 días, pero necesitaría un 59.

duilioisola
29-11-2017, 17:11:53
Con fuerza bruta he hecho esto...
// Log(s : string) imprime [TimeStamp] + s

procedure TFMPruebas.TButtDaysBetweenClick(Sender: TObject);
var
F1, F2 : TDateTime;

function Dias29FebreroEntreFechas(ANow, AThen: TDateTime) : integer;
var
aYear, aMonth, aDay: Word;
T : TDateTime;
begin
Result := 0;

// Invierto si es necesario
if (ANow > AThen) then
begin
T := AThen;
AThen := ANow;
ANow := T;
end;

// Recorro todos los dias entre las dos fechas y cuento los 29/2.
while (ANow < AThen) do
begin
DecodeDate(ANow, aYear, aMonth, aDay);
if ((aMonth = 2) and (aDay = 29)) then
inc(Result);
ANow := IncDay(ANow);
end;
end;

begin
F1 := EncodeDate(2017, 11, 29);
F2 := EncodeDate(2020, 11, 29);
Log(Format('DaysBetween(%s, %s) = %d (- %d) = %d', [DateToStr(F2), DateToStr(F1), DaysBetween(F2, F1), Dias29FebreroEntreFechas(F2, F1), DaysBetween(F2, F1) - Dias29FebreroEntreFechas(F2, F1)]));

F1 := EncodeDate(2017, 11, 29);
F2 := EncodeDate(2020, 02, 28);
Log(Format('DaysBetween(%s, %s) = %d (- %d) = %d', [DateToStr(F2), DateToStr(F1), DaysBetween(F2, F1), Dias29FebreroEntreFechas(F2, F1), DaysBetween(F2, F1) - Dias29FebreroEntreFechas(F2, F1)]));

F1 := EncodeDate(2020, 01, 01);
F2 := EncodeDate(2020, 02, 28);
Log(Format('DaysBetween(%s, %s) = %d (- %d) = %d', [DateToStr(F2), DateToStr(F1), DaysBetween(F2, F1), Dias29FebreroEntreFechas(F2, F1), DaysBetween(F2, F1) - Dias29FebreroEntreFechas(F2, F1)]));

F1 := EncodeDate(2020, 01, 01);
F2 := EncodeDate(2020, 03, 01);
Log(Format('DaysBetween(%s, %s) = %d (- %d) = %d', [DateToStr(F2), DateToStr(F1), DaysBetween(F2, F1), Dias29FebreroEntreFechas(F2, F1), DaysBetween(F2, F1) - Dias29FebreroEntreFechas(F2, F1)]));
end;


[2017-11-29 17:08:23.591] DaysBetween(29/11/2020, 29/11/2017) = 1096 (- 1) = 1095
[2017-11-29 17:08:23.591] DaysBetween(28/02/2020, 29/11/2017) = 821 (- 0) = 821
[2017-11-29 17:08:23.591] DaysBetween(28/02/2020, 01/01/2020) = 58 (- 0) = 58
[2017-11-29 17:08:23.591] DaysBetween(01/03/2020, 01/01/2020) = 60 (- 1) = 59

Bluefox
29-11-2017, 18:18:45
Así lo tenia, pero me gustaría encontrar una solución un poco mas bonita.

Es mas pretendía hacer la solución usando las funciones standard de delphi, pero no veo la posibilidad de una forma bonita...

Mil gracias de nuevo!

duilioisola
29-11-2017, 18:39:03
Por curiosidad: ¿Para qué necesitas este cálculo tan raro?

carnace
02-12-2017, 15:33:18
Por curiosidad: ¿Para qué necesitas este cálculo tan raro?
No es tan raro el cálculo. Eso es útil cuando calculas intereses por mora en aplicaciones financieras o calcular indicadores de calidad en salud, por ejemplo para saber cuántos dias en promedio se da una cita.

Casimiro Notevi
02-12-2017, 20:36:18
No es tan raro el cálculo. Eso es útil cuando calculas intereses por mora en aplicaciones financieras o calcular indicadores de calidad en salud, por ejemplo para saber cuántos dias en promedio se da una cita.
¿Y por qué no contar el 29 de febrero? :confused: