Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Calcular dias entre 2 fechas. (https://www.clubdelphi.com/foros/showthread.php?t=92571)

Bluefox 29-11-2017 14:23:30

Calcular dias entre 2 fechas.
 
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 14: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 14: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 14:53:39

Pues hazlo normalmente con DaysBetween y luego restas un día si es año bisiesto.

Bluefox 29-11-2017 15: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 18:11:53

Con fuerza bruta he hecho esto...
Código Delphi [-]
// 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;
Código Delphi [-]
[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 19: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 19:39:03

Por curiosidad: ¿Para qué necesitas este cálculo tan raro?

carnace 02-12-2017 16:33:18

Cita:

Empezado por duilioisola (Mensaje 523002)
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 21:36:18

Cita:

Empezado por carnace (Mensaje 523060)
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:


La franja horaria es GMT +2. Ahora son las 16:33:32.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi