En un formulario vacío ponemos un botón y agregamos la librería:
delphi
System.DateUtils
El procedimiento es el siguiente:
delphi
procedure CalcularTiempoTranscurrido; var FinicioReal, Fini, FFin: TDateTime; Meses, Dias, Horas, Min, Segundos, NoHabil: Integer; Feriados: array[0..1] of TDate; I: Integer; begin // Inicializar Datos Feriados[0] := StrToDate('02/05/2016'); Feriados[1] := StrToDate('05/05/2016'); // Esta es la fecha de inicio FinicioReal := StrToDateTime('29/04/2016'); // La inicializo con la fecha de inicio, pero no uso la anterior // porque esta la iré modificando en el camino Fini := FinicioReal; FFin := Now; // Calcular meses Meses := MonthsBetween(Fini, FFin); // Calcular Días Fini := Fini + (Meses * 30); Dias := DaysBetween(Fini, FFin); Fini := Fini + Dias; // Calcular horas Horas := HoursBetween(Fini, FFin); Fini := Fini + (Horas / 24); // Calcular min Min := MinutesBetween(Fini, FFin); Fini := Fini + (Min / 1440); // 1440 es la cantidad de minutos que tiene un día // Calculo segundos Segundos := SecondsBetween(Fini, FFin); // Mostrar ShowMessage(Format('Meses %s, Dias %s, Horas %s, Minutos %s, Segundos %s', [meses.ToString, dias.ToString, horas.ToString, min.ToString, segundos.ToString])); //******* Hasta aqui tenemos el conteo de tiempo real vamos a ver si hay fines de semana******** Fini := FinicioReal; // inicializo a cero cantidad de no habiles NoHabil := 0; while (Fini <= FFin) do begin //1 lunes, 5 viernes, 6 sabado, 7 domingo if ((DayOfTheWeek(Fini) > 1) and (DayOfTheWeek(Fini) < 5)) then Inc(NoHabil) else begin // si no es fin de semana, checamos si es feriado for I := 0 to Length(Feriados) - 1 do if Feriados[I] = Fini then Inc(NoHabil); end; Fini := Fini + 1; end; Dias := Dias - NoHabil; // Mostrar ShowMessage(Format('Meses %s, Dias %s, Horas %s, Minutos %s, Segundos %s', [meses.ToString, dias.ToString, horas.ToString, min.ToString, segundos.ToString])); end;
El resultado basado en las fechas que utilicé es (Tomando en cuenta solo el tiempo real transcurrido):
Captura de pantalla 2016-05-06 14.49.02.png 3.48KB 2 downloads
El segundo mensaje que muestra es después de calcular feriados y fines de semana:
Captura de pantalla 2016-05-06 14.49.11.png 3.48KB 2 downloads
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.