Ajuda - Busca - Membros - Calendário
Versão Completa: (Resolvido) Como Somar Horas, min, sec. Ex: 34:23:19
Fórum Script Brasil > Programação & Desenvolvimento > Delphi, Kylix
Rafael Ricardo
Estou fazendo um sistema de falhas e preciso e preciso computar quanto tempo essa falha perdurou.
Já procurei sobre isso em alguns foruns mas sempre acho soluções usando hourbetween. Sei que essa solução pode resolver o meu problema mas não sei como aplicá-la. o meu problema é o seguinte, exemplo:

Uma falha ocorreu na data 13/10/2010 às 13:25:10h e só foi normalizada no Dia 14/10/2010 às 15:33:15h.

com o exemplo acima, o programa deve armazenar na variável "TempoIndisponivel" o total de horas em que a falha existiu, que nesse caso, preciso que seja 26:08:05h, ou seja, 26 horas, 8 minutos e 5 segundos.

Preciso que o sistema entenda que passaram-se 24 horas do início da falha e que some com as horas, minutos e segundos restantes do horário em que a falha terminou.

Estou usando Banco ACCESS o campo da Data inicial e final no access está com formato dd/mm/aaaa.
O campo hora inicial e final possuem formato hh:mm:ss.

Ainda não estou usando nenhum código para fazer isso. Tentei alguns mas não funcionaram. O método de acesso ao ACCESS é ADO.

encontrei a função abaixo do Micheus que é usuário desse mesmo fórum mas essa função não calcula os segundos. Se alguém puder me ajudar e mostrar um exemplo em um button eu agradeço muito!
-----------------------------------------------------------------------------------------------------------
function FullTimeToStr(SUMTime: TDateTime): string;
var
StrHor,
StrMin :string;
TotHor :double;
begin
TotHor := SUMTime *24;
if (TotHor -Trunc(TotHor)) > 0.9999 then
TotHor := Round(TotHor);
StrHor := FormatFloat('##0:', Int(TotHor));
StrMin := FormatDateTime('nn:ss', Frac(TotHor)/24);
Result := StrHor +StrMin;
end;
-----------------------------------------------------------------------------------------------------------

Muito Obrigado se alguém puder ajudar! huh.gif
Jhonas
A lógica é que o tempo total esteja em segundos, para facilitar o calculo

CODE
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Edit1: TEdit;
    Edit2: TEdit;
    Label1: TLabel;
    procedure Button1Click(Sender: TObject);
    procedure FormActivate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

uses DateUtils;

{$R *.dfm}

//Função converter Segundos para Horas

function Seg_Hora( Seg:LongInt ):string;
Var Hora,Min:LongInt;
  Tmp : Double;
begin
   Tmp := Seg / 3600;
   Hora := Round(Int(Tmp));
   Seg :=  Round(Seg - (Hora*3600));
   Tmp := Seg / 60;
   Min := Round(Int(Tmp));
   Seg :=  Round(Seg - (Min*60));
   Result := FormatFloat( '00', Hora )+ ':' + FormatFloat( '00', Min ) + ':' + FormatFloat( '00', Seg );
end;


procedure TForm1.Button1Click(Sender: TObject);
var total : int64; ini, fim : TDateTime;
begin
   ini := strtodatetime(Edit1.Text);
   fim := strtodatetime(Edit2.Text);

   total := SecondsBetween(ini,fim); //  retorna o numero de segundos entre a data_hora inicial e a data_hora final
   Label1.Caption := 'Tempo Total Indisponivel : '+ seg_hora(total);
end;

procedure TForm1.FormActivate(Sender: TObject);
begin
   edit1.Text := '13/10/2010 13:25:10';
   edit2.Text := '14/10/2010 15:33:15';
end;

end.


abraço
Rafael Ricardo
QUOTE(Jhonas @ 18/10/2010 - 21:48) *
A lógica é que o tempo total esteja em segundos, para facilitar o calculo

CODE
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Edit1: TEdit;
    Edit2: TEdit;
    Label1: TLabel;
    procedure Button1Click(Sender: TObject);
    procedure FormActivate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

uses DateUtils;

{$R *.dfm}

//Função converter Segundos para Horas

function Seg_Hora( Seg:LongInt ):string;
Var Hora,Min:LongInt;
  Tmp : Double;
begin
   Tmp := Seg / 3600;
   Hora := Round(Int(Tmp));
   Seg :=  Round(Seg - (Hora*3600));
   Tmp := Seg / 60;
   Min := Round(Int(Tmp));
   Seg :=  Round(Seg - (Min*60));
   Result := FormatFloat( '00', Hora )+ ':' + FormatFloat( '00', Min ) + ':' + FormatFloat( '00', Seg );
end;


procedure TForm1.Button1Click(Sender: TObject);
var total : int64; ini, fim : TDateTime;
begin
   ini := strtodatetime(Edit1.Text);
   fim := strtodatetime(Edit2.Text);

   total := SecondsBetween(ini,fim); //  retorna o numero de segundos entre a data_hora inicial e a data_hora final
   Label1.Caption := 'Tempo Total Indisponivel : '+ seg_hora(total);
end;

procedure TForm1.FormActivate(Sender: TObject);
begin
   edit1.Text := '13/10/2010 13:25:10';
   edit2.Text := '14/10/2010 15:33:15';
end;

end.


abraço



Impressionante como conhecimento é tudo!! blink.gif
Ontem eu consegui escrever um código sozinho que conseguiu fazer exatamente o que eu queria, terminei às 03:00 da Madruga wacko.gif . Já estava me achando o "tal" quando retornei ao forum e vi a resposta do Jhonas acima com 50 linhas amenos que o código que eu fiz e produzindo o mesmo resultado blink.gif . Como eu não tenho tanto conhecimento precisei fazer 2 procedures e uma codificação final em um button que utiliza em conjunto os comandos do próprio botão com as 2 procedures. Deu um total de 72 linhas.

Depois do exemplo acima tenho até vergonha de postar o código que eu usei rolleyes.gif .

Para os curiosos e iniciantes que quiserem se familiarizar com conversões e quiserem queimar um pouco a pestana o código fonte com o executável Baixem o projeto aqui

Em fim, Muito Obrigado Jhonas!! Posso dizer que salvou meu projeto!! Irei usar seu exemplo pois o meu ficou um pouco grande já que tive que fazer na "munheca" todos os cálculos de horas entre dias, coisa que a sua function facilitou bastante!
Esta é uma versão simplificada de nosso conteúdo principal. Para ver a versão completa com maiores informações, formatação e imagens, por favor clique aqui.
Invision Power Board © 2001-2012 Invision Power Services, Inc.