Ir para conteúdo

POWERED BY:

Arquivado

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

Tatiane.InterArt

[Resolvido] intervalo de horas - calcular minutos - está com prob

Recommended Posts

Tenho uma telinha de cartão de ponto, onde para cada intervalo faço cálculo de atrazo e extra usando o

MinutesBetween, o que está acontecendo é que dependendo do horário q tenho ele não retorna corretamente os minutos, por exemplo:

 

MaskEdit5 - MaskEdit6

18:00 - 18:54

12:00 - 12:54

 

e outras variações com minutos diferenciados

 

Var Min:Integer;

Begin

Min:=MinutesBetween(StrToTime(MaskEdit5.Text),StrToTime(MaskEdit6.Text));

 

Min deveria ser igual a 54 correto

mas ele me mostra 53

 

o que acontece é q essa diferença de 1min já faz uma grande diferença no cálculo de hora extra, como posso resolver isso?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Depois de fazer vários testes, pude observar que isto muito provavelmente se deve a um problema associado a números com ponto flutuante e ao fato de MinutesBetween não arredondar valores.

Vejam o que consta no help que encontrei:

"(...) MinutesBetween counts only entire minutes. Thus, MinutesBetween reports the difference between 9:00:00 AM and 9:00:59:999 AM as 0 because the difference is one millisecond short of an entire minute."

lembrando que esta é a apresentação em forma de horas, quando o valor em si (um double), convertido em minutos seria:

09:00:00 => 540 minutos

09:00:55:999 => 540,9999833333...

e ao observar que ele considera a diferença como 0, concluí-se que a função não faz arredondamento - usa a parte inteira.

Associado a isso, tem a questão da operação com ponto flutuante

 

Encontrei uma forma para "substituir" a função MinutesBetween

 

CODE

function NewMinutesBetween(aNow, aThen :TDateTime) :Int64;

var

MinDiff :Extended;

begin

MinDiff := (aThen -aNow) *24 *60;

if (MinDiff -Trunc(MinDiff)) > 0.9999 then

MinDiff := Round(MinDiff);

 

Result := Trunc(MinDiff);

end;

 

 

E um exemplinho de teste, colocando os valores em 2 labels:

CODE

procedure TForm1.Button2Click(Sender: TObject);

begin

Label1.Caption := IntToStr(MinutesBetween(StrToTime(MaskEdit1.Text),StrToTime(MaskEdit2.Text)));

Label2.Caption := IntToStr(NewMinutesBetween(StrToTime(MaskEdit1.Text),StrToTime(MaskEdit2.Text)))

;

end;

 

dentro daqueles horários:

12:00 a 12:54

18:00 a 18:54 entre outros

 

no Label1 o resultado é 53 minutos

no label2 o resultado é 54 minutos

 

Fica aí a dica para quem precise!

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.