DateUtils (MinutesBetween) - Duvida no resultado
Pessoal,
Estou tentando obter a diferença de minutos entre duas variaveis do tipo TTime para isso estou usando DateUtils, estou fazendo assim:
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!!!
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
Curtidas 0
Respostas
Mmoreira
11/12/2006
Apos fazer uns testes percebi que quando incremento 14 minutos:
Ai a diferença retornada é de 14 minutos mesmo.
Ai a diferença retornada é de 13 minutos tambem.
Quando coloquei aconteceu o mesmo problema com o 15, aqui no 12 a diferença retornada foi 11 ou seja menos 1.
Quando cheguei no 11 a diferença retornada foi correta 11 mesmo.
Alguem se abilita?
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
Massuda
11/12/2006
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......e verá que a diferença é sempre 15 minutos.
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
Mmoreira
11/12/2006
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.
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
Mmoreira
11/12/2006
Massuda,
Só mais uma coisa, o seguinte código não esta funcionando:
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
Ai sim quando chegou no horario Marcado o codigo funcionou.
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
Massuda
11/12/2006
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!´);
GOSTEI 0
Mmoreira
11/12/2006
Massuda,
Fiz como voce falou mas mesmo assim ainda nao funcionou, da uma olhada no codigo:
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?
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
Massuda
11/12/2006
Isto funciona comigo......avisa que os horários são iguais.
Previsto := EncodeTime(12, 51, 0, 0); Marcado := StrToTime(´12:50´); if Abs( Previsto - Marcado ) < EncodeTime(0, 1, 0, 0) then...
GOSTEI 0
Emerson Nascimento
11/12/2006
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.
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
Marco Salles
11/12/2006
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;
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
Massuda
11/12/2006
o problema é que...
É isso mesmo!Para pegar só o horário, pode fazer...
Previsto := Frac(IncMinute( now, 15 ));
GOSTEI 0
Emerson Nascimento
11/12/2006
ou simplesmente:
Previsto := IncMinute( TIME, 15 );
GOSTEI 0
Mmoreira
11/12/2006
Pessoal,
Realmente o problema estava nesta linha:
Pois eu fiz o teste sugerido pelo Emerson.EN e realmente a data estava sendo trazida, entao fiz a substituição:
Ai o código funcionou perfeitamente como eu precisava.
Gostaria de agradecer a atenção de todos Massuda, Emerson e Marco.
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