Ir al contenido


Foto

Calcular tiempo trascurrido entre fechas descontando fines de semana y feriados

Fechas calculo de tiempo feriados fines de semana dateutils rango de fechas between hoursbetween monthsBetween minutesbetween

  • Por favor identifícate para responder
6 respuestas en este tema

#1 erickahr

erickahr

    Newbie

  • Miembros
  • Pip
  • 7 mensajes

Escrito 06 mayo 2016 - 01:57

Compañeros, buenos días, buenas tardes o buenas noches. Les comparto un pequeño procedimiento que hice para calcular el tiempo trascurrido entre dos fechas, descuenta los fines de semana y descuenta los días feriados.
 
En un formulario vacío ponemos un botón y agregamos la librería: 

delphi
  1. System.DateUtils

El procedimiento es el siguiente:

delphi
  1. procedure CalcularTiempoTranscurrido;
  2. var
  3. FinicioReal, Fini, FFin: TDateTime;
  4. Meses, Dias, Horas, Min, Segundos, NoHabil: Integer;
  5. Feriados: array[0..1] of TDate;
  6. I: Integer;
  7. begin
  8. // Inicializar Datos
  9. Feriados[0] := StrToDate('02/05/2016');
  10. Feriados[1] := StrToDate('05/05/2016');
  11. // Esta es la fecha de inicio
  12. FinicioReal := StrToDateTime('29/04/2016');
  13. // La inicializo con la fecha de inicio, pero no uso la anterior
  14. // porque esta la iré modificando en el camino
  15. Fini := FinicioReal;
  16. FFin := Now;
  17.  
  18. // Calcular meses
  19. Meses := MonthsBetween(Fini, FFin);
  20.  
  21. // Calcular Días
  22. Fini := Fini + (Meses * 30);
  23. Dias := DaysBetween(Fini, FFin);
  24. Fini := Fini + Dias;
  25.  
  26. // Calcular horas
  27. Horas := HoursBetween(Fini, FFin);
  28. Fini := Fini + (Horas / 24);
  29.  
  30. // Calcular min
  31. Min := MinutesBetween(Fini, FFin);
  32. Fini := Fini + (Min / 1440); // 1440 es la cantidad de minutos que tiene un día
  33.  
  34. // Calculo segundos
  35. Segundos := SecondsBetween(Fini, FFin);
  36.  
  37. // Mostrar
  38. ShowMessage(Format('Meses %s, Dias %s, Horas %s, Minutos %s, Segundos %s', [meses.ToString,
  39. dias.ToString, horas.ToString, min.ToString, segundos.ToString]));
  40.  
  41. //******* Hasta aqui tenemos el conteo de tiempo real vamos a ver si hay fines de semana********
  42. Fini := FinicioReal;
  43. // inicializo a cero cantidad de no habiles
  44. NoHabil := 0;
  45. while (Fini <= FFin) do begin
  46. //1 lunes, 5 viernes, 6 sabado, 7 domingo
  47. if ((DayOfTheWeek(Fini) > 1) and (DayOfTheWeek(Fini) < 5)) then
  48. Inc(NoHabil)
  49. else begin // si no es fin de semana, checamos si es feriado
  50. for I := 0 to Length(Feriados) - 1 do
  51. if Feriados[I] = Fini then
  52. Inc(NoHabil);
  53. end;
  54. Fini := Fini + 1;
  55. end;
  56. Dias := Dias - NoHabil;
  57.  
  58. // Mostrar
  59. ShowMessage(Format('Meses %s, Dias %s, Horas %s, Minutos %s, Segundos %s', [meses.ToString,
  60. dias.ToString, horas.ToString, min.ToString, segundos.ToString]));
  61.  
  62. end;

El resultado basado en las fechas que utilicé es (Tomando en cuenta solo el tiempo real transcurrido):
Archivo adjunto  Captura de pantalla 2016-05-06 14.49.02.png   3,48KB   2 descargas
 
El segundo mensaje que muestra es después de calcular feriados y fines de semana:
Archivo adjunto  Captura de pantalla 2016-05-06 14.49.11.png   3,48KB   2 descargas
 
Los días feriados los tengo en un array, ustedes los pueden tomar de su BD o de donde los tengan listados.
 
En fin, es un procedimiento muy simple (aunque quizás un poco rebuscado, no lo se) pero, espero que les sirva para algo.
 
Saludos.  ;)
  • 3

#2 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 06 mayo 2016 - 03:13

Pues claro que será de utilidad, muchas gracias por el aporte!.


  • 1

#3 jmonfor

jmonfor

    Member

  • Miembros
  • PipPip
  • 20 mensajes

Escrito 07 mayo 2016 - 12:44

Buen aporte, sí señor. Muchas gracias
  • 1

#4 ELKurgan

ELKurgan

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 566 mensajes
  • LocationEspaña

Escrito 07 mayo 2016 - 04:15

Gracias por compartir, amigo


  • 1

#5 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.446 mensajes
  • LocationMéxico

Escrito 07 mayo 2016 - 09:53

Siempre son útiles éste tipo de "tips", gracias amigo.

 

Saludos


  • 1

#6 roly

roly

    Newbie

  • Miembros
  • Pip
  • 3 mensajes
  • LocationBOLIVIA

Escrito 09 mayo 2016 - 01:36

(y) buen aporte


  • 1

#7 djkjallo

djkjallo

    Newbie

  • Miembros
  • Pip
  • 4 mensajes

Escrito 22 junio 2016 - 09:39

buen aporte man :ap:


  • 1




IP.Board spam blocked by CleanTalk.