Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

JonatasFn

Somar e Subtrair Horas

Recommended Posts

Pessoal, como faço para somar e subtrair horas no Delphi.

Já consegui usando variáveis do tipo TTimer, mas não é isso que eu preciso.

Pq desta forma o resultado de 12:00 + 13:00 é 01:00

 

Mas eu quero que seja assim: 12:00 + 13:00 = 25:00

 

E preciso subtrair tbm, não sei se é da mesma forma.

 

Grato

Compartilhar este post


Link para o post
Compartilhar em outros sites

você esta trabalhando com qual banco de dados???

 

MySQL, mas eu preciso somar/subtrair antes de enviar ao banco... É um cadastro de horas extras.

Vou precisar tbm somar/subtrair as horas vindas do BD, mas o primordial é antes de enviar ao BD.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Amigo, existem diversas formas de calcular horas no delphi, além de métodos prontos na unit DateUtils. Veja o exemplo abaixo:

 

procedure TForm1.Button1Click(Sender: TObject);
var sTempo : String;
    dHoraIni, dHoraFim : TDateTime;
begin
   dHoraIni := Now-1;
   dHoraFim := Now;
   sTempo := IntToStr(HoursBetween(dHoraFim, dHoraIni));
   showmessage('Data/Hora Inicial: ' + DateTimeToStr(dHoraIni) + #13 +
               'Data/Hora Final: ' + DateTimeToStr(dHoraFim) + #13 +
               'Diferença em Horas entre Data/Hora inicial e final: ' + sTempo);
end;

Coloque o código acima no seu form num botão e verá que ele lhe retornará 24 horas. Contudo, você perderia o tempo em minutos que poderia existir de diferença entre a data/hora inicial e data/hora final trabalhada... agora, se você grava a hora que o funcionário entrou e a hora que ele saiu diariamente, você pode montar alguma procedure via MySQL mesmo para que ela calcule pra você quantas horas extras o empregado fez no mês, basta você por exemplo somar todas as horas que ele fez no mês e diminuir das horas normais dele... a diferença seria as horas extras, não precisaria assim gravar isso diariamente.

 

[]'s

Compartilhar este post


Link para o post
Compartilhar em outros sites

Chrnos, eu entendi o seu raciocínio. Só que na verdade este lançamento será mensal, ou seja, em um determinado dia do mês o responsável irá lançar a data, a hora de entrada(início da hora extra) e a hora de saída(fim da hora extra). Só que durante este tempo poderá haver intervalos, como por exemplo para café.

 

Então seria assim:

 

(Intervalo(Início) - Entrada) + (Saída - Intervalo(Fim)) = Resutado para o BD

(18:30 - 17:30) + (19:30 - 18:45) = 01:45

 

A inserção destas, se dará com 4 edits.

Andei lendo que o DateUtils tem uma função IncHour, mas além de não conhecer esta função, não sei se ela subtrai.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Porque não transforma tudo em minutos no BD? Grave os horários de entrada e saída se quiser, mas deixe-os também salvos em minutos... vai facilitar seus cálculos depois. Num sistema de ponto que tinhamos, os tempos eram gravados em minutos onde precisavam ser calculados e depois transformados em horas/minutos nos relatórios. Fica mais fácil pra calcular que usando campos de hora mesmo.

 

Dê uma lida neste post e neste post também.... o problema apresentado ali é semelhante ao seu, talvez possa implementar sua solução com base na sugerida ali.

 

[]'s

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pessoal, achei uma solução pra subtrair, que ainda não é bem uma solução:

Tá aí:

 

a:= StrToTime(Edit1.Text);
b:= StrToTime(Edit2.Text);
a,b : TTime;
  H1, H2: Integer;
  M1, M2, HDiff, MDiff : integer;
  Result : TTime;


H1 := HourOf(A);
  H2 := HourOf(B);
  M1 := MinuteOf(A);
  M2 := MinuteOf(B);
  if CompareTime(A, B) > 0 then
  begin
    H1 := HourOf(A);
    H2 := HourOf(B);
    M1 := MinuteOf(A);
    M2 := MinuteOf(B);
  end
  else
  begin if CompareTime(A, B) < 0 then
    H1 := HourOf(B);
    H2 := HourOf(A);
    M1 := MinuteOf(B);
    M2 := MinuteOf(A);
  end;
  if M1 < M2 then
  begin
    H1 := H1 - 1;
    M1 := M1 + 60;
  end;
  HDiff := H1-H2;
  MDiff := M1-M2;
  Result := StrToTime(IntToStr(Abs(HDiff))+':'+IntToStr(Abs(MDiff)));
//  Result := (IntToStr(Abs(HDiff))+':'+IntToStr(Abs(MDiff)));

  Edit3.Text := TimeToStr(Result);

Agora só me falta somar ... Alguém tem alguma idéia... Ou é melhor eu seguir a dica do Crhnos e transformar em minutos?

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.