GARANTIR DESCONTO

Fórum DateUtils (MinutesBetween) - Duvida no resultado #334545

11/12/2006

0

Pessoal,
Estou tentando obter a diferença de minutos entre duas variaveis do tipo TTime para isso estou usando DateUtils, estou fazendo assim:

procedure TForm1.Button1Click(Sender: TObject);
var
  Agora, Previsto : TTime;
  x : integer;
begin

  Agora := now;
  Label5.Caption := TimeToStr(agora);

  Previsto := IncMinute( now, 15 );
  Label3.Caption := TimeToStr(previsto);

  x := MinutesBetween( Agora, Previsto );  

  Label1.Caption := IntToStr(x);

end;


Se eu nao estiver ficando maluco, pirado da cabeça .. o resultado ai na Variavel X deveria ser 15 e nao 14 como esta acontecendo.

[img]
[URL=http://img131.imageshack.us/my.php?image=telacodigoyj4.gif][img:751df23360]http://img131.imageshack.us/img131/2734/telacodigoyj4.th.gif[/img:751df23360][/URL]
[/img]

Bom se alguem puder dar uma ajuda .. valew!!!


Mmoreira

Mmoreira

Responder

Posts

11/12/2006

Mmoreira

Apos fazer uns testes percebi que quando incremento 14 minutos:

Previsto := IncMinute( Agora, 14 );


Ai a diferença retornada é de 14 minutos mesmo.


Previsto := IncMinute( Agora, 13 );


Ai a diferença retornada é de 13 minutos tambem.




Previsto := IncMinute( Agora, 12 );


Quando coloquei aconteceu o mesmo problema com o 15, aqui no 12 a diferença retornada foi 11 ou seja menos 1.




Previsto := IncMinute( Agora, 11);


Quando cheguei no 11 a diferença retornada foi correta 11 mesmo.



Alguem se abilita?


Responder

Gostei + 0

11/12/2006

Massuda

TDateTime, TTime e TDate são números em ponto flutuante e portanto esses números podem não ter representação interna exata. Para piorar, MinutesBetween() retorna o total de minutos inteiros entre dois horários, de modo que uma diferença de 14min 59.999s retorna como sendo 14 min. Experimente este código...
var 
  Agora, Previsto : TTime; 
  Diferenca : TTime; 
begin 

  Agora := now; 
  Label5.Caption := TimeToStr(agora); 

  Previsto := IncMinute( Agora, 15 ); 
  Label3.Caption := TimeToStr(previsto); 

  Diferenca := Previsto - Agora;  

  Label1.Caption := TimeToStr(Diferenca); 

end; 
...e verá que a diferença é sempre 15 minutos.


Responder

Gostei + 0

12/12/2006

Mmoreira

Massuda,

Muito obrigado pela explicação.
Ficou bem claro porque esta diferença aconteceu no meu código. O código da maneira que voce passou funcionou perfeitarmente sem problema algum.

Mais uma vez, muito obrigado pela atenção.

Um abraço.


Responder

Gostei + 0

12/12/2006

Mmoreira

Massuda,
Só mais uma coisa, o seguinte código não esta funcionando:

procedure TForm1.Button2Click(Sender: TObject);
var
  Marcado, Previsto : TTime;

begin

  Previsto := IncMinute( now, 15 );
  Label7.Caption := TimeToStr(previsto);

  Marcado := StrToTime(Edit1.Text);
  Label8.Caption := TimeToStr(Marcado);

  if Previsto = Marcado then ShowMessage(´Mesmo horario!´);

end;


Seria pelo mesmo motivo explicado por voce anteriormente?

Antes de criar este post eu fiz uma busca aqui no forum sobre o assunto, achei muito pouca coisa usando o DateUtils e como eu queria trabalhar usando as funções encontradas no DateUtils resolvi quebrar um pouco a cabeça.
O que eu precisava na verdade é pegar a hora atual adicionar um determinado numero de minutos nela e ver se é igual a uma hora que esta gravada no meu banco de dados ... Isso ai é para uma agenda de compromisso com um alerta alguns mitutos antes do compromisso marcado.

Seria mais ou menos este codigo que postei agora ... mas a comparação nao esta funcionando assim, fiz um teste convertento TimeToStriing

  if TimeToStr( Previsto ) = TimeToStr( Marcado ) then ShowMessage(´Mesmo horario!´);


Ai sim quando chegou no horario Marcado o codigo funcionou.


Responder

Gostei + 0

12/12/2006

Massuda

Seria pelo mesmo motivo explicado por voce anteriormente?
Sim.

Qualquer comparação envolvendo números em ponto flutuante (TDateTime, Double, etc) deveria ser feita de modo a permitir uma pequena variação. No seu caso...
if Abs(Previsto - Marcado) < EncodeTime(0, 1, 0, 0) then ShowMessage(´Mesmo horario!´);
...isso testa se o previsto é igual ao marcado com uma tolerância de 1 minuto.


Responder

Gostei + 0

12/12/2006

Mmoreira

Massuda,
Fiz como voce falou mas mesmo assim ainda nao funcionou, da uma olhada no codigo:

procedure TForm1.Button2Click(Sender: TObject);
var
  Marcado, Previsto : TTime;

begin

  Previsto := IncMinute( now, 15 );
  Label7.Caption := TimeToStr(previsto);

  Marcado := StrToTime(Edit1.Text);
  Label8.Caption := TimeToStr(Marcado);

  if Abs( Previsto - Marcado ) < EncodeTime(0, 1, 0, 0) then ShowMessage(´Mesmo horario!´);

end;


Exmplo:
HoraAtual := 12:00:00
Marcado := 12:15:00

Deveria retornar verdadeiro mas isso nao aconteceu, mesmo esperando 1 minuto de tolerancia nao funcionou.
Eu deveria ter feito alguma substituição no codigo?


Responder

Gostei + 0

12/12/2006

Massuda

Isto funciona comigo...
  Previsto := EncodeTime(12, 51, 0, 0);
  Marcado := StrToTime(´12:50´);

  if Abs( Previsto - Marcado ) < EncodeTime(0, 1, 0, 0) then...
...avisa que os horários são iguais.


Responder

Gostei + 0

12/12/2006

Emerson Nascimento

o problema é que:
Previsto := IncMinute( now, 15 );
[color=red:e868b68ec5]traz data e hora[/color:e868b68ec5]

enquanto que
Marcado := StrToTime(Edit1.Text);
[b:e868b68ec5]aparentemente, [/b:e868b68ec5][color=red:e868b68ec5]traz apenas a hora[/color:e868b68ec5].

para comprovar isso, faça:
Label7.Caption := [b:e868b68ec5]DateTimeToStr[/b:e868b68ec5](Previsto);
Label8.Caption := [b:e868b68ec5]DateTimeToStr[/b:e868b68ec5](Marcado);
e compare.


Responder

Gostei + 0

12/12/2006

Marco Salles

se quiser precisão , pode fazer no braço também

function DiferencaEntreDoisHorario(Horai,Horaf:TTime;diferenca:Word):boolean;
var
hi,mi,si,msi:Word;
hf,mf,sf,msf:Word;
begin
decodetime(Horai,hi,mi,si,msi);
decodetime(horaf,hf,mf,sf,msf);
result:=(3600*diferenca = (216000*(hf-hi)+3600*(mf-mi)+60*(sf-si)+(msf-msi)));
end;


Responder

Gostei + 0

12/12/2006

Massuda

o problema é que...
É isso mesmo!

Para pegar só o horário, pode fazer...
Previsto := Frac(IncMinute( now, 15 )); 



Responder

Gostei + 0

12/12/2006

Emerson Nascimento

ou simplesmente:
Previsto := IncMinute( TIME, 15 );



Responder

Gostei + 0

12/12/2006

Mmoreira

Pessoal,
Realmente o problema estava nesta linha:

Previsto := IncMinute( now, 15 ); 


Pois eu fiz o teste sugerido pelo Emerson.EN e realmente a data estava sendo trazida, entao fiz a substituição:

Previsto := IncMinute( time, 15 ); 


Ai o código funcionou perfeitamente como eu precisava.

Gostaria de agradecer a atenção de todos Massuda, Emerson e Marco.


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar