Fórum DateUtils (MinutesBetween) - Duvida no resultado #334545
11/12/2006
0
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
Curtir tópico
+ 0Posts
11/12/2006
Mmoreira
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?
Gostei + 0
11/12/2006
Massuda
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;
Gostei + 0
12/12/2006
Mmoreira
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.
Gostei + 0
12/12/2006
Mmoreira
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.
Gostei + 0
12/12/2006
Massuda
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!´);
Gostei + 0
12/12/2006
Mmoreira
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?
Gostei + 0
12/12/2006
Massuda
Previsto := EncodeTime(12, 51, 0, 0); Marcado := StrToTime(´12:50´); if Abs( Previsto - Marcado ) < EncodeTime(0, 1, 0, 0) then...
Gostei + 0
12/12/2006
Emerson Nascimento
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.
Gostei + 0
12/12/2006
Marco Salles
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;
Gostei + 0
12/12/2006
Massuda
Para pegar só o horário, pode fazer...
Previsto := Frac(IncMinute( now, 15 ));
Gostei + 0
12/12/2006
Emerson Nascimento
Previsto := IncMinute( TIME, 15 );
Gostei + 0
12/12/2006
Mmoreira
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.
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)