Hora maior que 24
Como faço para transformar um astring que contem por exemplo o valor ´36´ em horas???
Eu estou fazendo:
StrToTime(´36´);
Mas 36 não é uma hora valida e eu gostaria que fosse, qp elea é uma somatorias de varias horas.
Obrigada
Eu estou fazendo:
StrToTime(´36´);
Mas 36 não é uma hora valida e eu gostaria que fosse, qp elea é uma somatorias de varias horas.
Obrigada
Celamar
Curtidas 0
Respostas
Rjun
28/09/2005
Que tipo de operação você pretende fazer?
GOSTEI 0
Celamar
28/09/2005
Eu fiz:
O numero de horas previsto no mês
O numero de horas trabalhadas
E O Saldo
//total previsto sTotalPrevisto := IntToStr(iTotalDias * iCargaHoraria); lbTotalPrevisto.Caption := sTotalPrevisto + ´:00´; //total executado lbTotalExecutado.Caption := TimeToStr(tTotalExecutado); //saldo tTeste := StrTotime(sTotalPrevisto); lbSaldo.Caption := TimeToStr(tTotalExecutado - tTeste);
O numero de horas previsto no mês
O numero de horas trabalhadas
E O Saldo
GOSTEI 0
Rjun
28/09/2005
Trabalhe com segundos. Dê uma pesquisada no forum que tem como converter os segundos em uma string no formato de hora. Talvez isso resolva seu problema.
GOSTEI 0
Massuda
28/09/2005
Você pode fazer algo assim...
var iTotalPrevisto: Integer; ... //total previsto iTotalPrevisto := iTotalDias * iCargaHoraria; sTotalPrevisto := IntToStr(iTotalPrevisto); lbTotalPrevisto.Caption := sTotalPrevisto + ´:00´; //total executado lbTotalExecutado.Caption := TimeToStr(tTotalExecutado); //saldo tTeste := iTotalPrevisto / 24; lbSaldo.Caption := FormatDateTime(´d h:mm:ss´ , tTotalExecutado - tTeste);
GOSTEI 0
Celamar
28/09/2005
Tem certeza q isso da certo, comigo nao funcionou nao.
GOSTEI 0
Celamar
28/09/2005
Desculpa car, funciona sim, eu que estava marcando.
Obrigada
Obrigada
GOSTEI 0
Celamar
28/09/2005
Gostaria de saber como faço para trabalhar com o TTime quando a hora passa de 23:59:59, por exemplo:
Dia um = 12:00
Dia dois = 10:00
Dia tres = 8:00
Total = 30:00h
Obrigada
Dia um = 12:00
Dia dois = 10:00
Dia tres = 8:00
Total = 30:00h
Obrigada
GOSTEI 0
Massuda
28/09/2005
O TTime (assim como o TDate e o TDateTime) é um número que representa um total de dias; a parte inteira é o número de dias e a parte fracionária é a fração de dia. Por exemplo, 36 horas equivale a um TTime igual a 1.5, ou seja, um dia (24 horas) mais 12 horas.
Para exibir o valor da forma que você quer, use uma função para formatar parecida com esta......é meio complicado, mas o Delphi só possui (acho) funções que consideram a hora no intervalo entre 0 e 23.
Para exibir o valor da forma que você quer, use uma função para formatar parecida com esta...
function Exemplo(T: TTime): string; var H, M, S, MS: Word begin DecodeTime(T, H, M, S, MS); Result := Format(´¬d:¬02d:¬02d´, [Int(T)*24 + H, M, S]); end;
GOSTEI 0
Celamar
28/09/2005
Mas deu errode incompatibilidade
DecodeTime(tPrevistoAux, H, M, S, MS);
lbSaldo.Caption := Format(´¬d:¬02d:¬02d´, [Int(tPrevistoAux)*24 + H, M, S]);
Erro: Format ¬d invalid or incompatible with argument
DecodeTime(tPrevistoAux, H, M, S, MS);
lbSaldo.Caption := Format(´¬d:¬02d:¬02d´, [Int(tPrevistoAux)*24 + H, M, S]);
Erro: Format ¬d invalid or incompatible with argument
GOSTEI 0
Massuda
28/09/2005
Desculpe... o correto seria...
lbSaldo.Caption := Format(´¬d:¬02d:¬02d´, [Trunc(tPrevistoAux)*24 + H, M, S]);
GOSTEI 0
Luineumann
28/09/2005
pq vc não armazena o total de horas em um campo integer?
se vc controla apenas horas inteiras soma 1 a cada hora
se vc controla horas e minutos faz alguma coisa assim para armazenar
decodetime(tempo, hh, mm, ss, sss);
horas_a_somar := (hh * 60) + mm;
horas_totais := horas_totais + horas_a_somar;
no final do mês, decompoe o campom horas_totais
aux := horas_totais;
dias := 0;
horas := 0;
minutos := 0;
while aux > 23
do begin
dias := dias + 1;
aux := aux - 24;
end
while aux > 59
do begin
horas := horas + 1;
aux := aux - 60;
end;
minutos := aux;
ao final desta rotina vc tem o tempo total em dias, horas e minutos
se vc controla apenas horas inteiras soma 1 a cada hora
se vc controla horas e minutos faz alguma coisa assim para armazenar
decodetime(tempo, hh, mm, ss, sss);
horas_a_somar := (hh * 60) + mm;
horas_totais := horas_totais + horas_a_somar;
no final do mês, decompoe o campom horas_totais
aux := horas_totais;
dias := 0;
horas := 0;
minutos := 0;
while aux > 23
do begin
dias := dias + 1;
aux := aux - 24;
end
while aux > 59
do begin
horas := horas + 1;
aux := aux - 60;
end;
minutos := aux;
ao final desta rotina vc tem o tempo total em dias, horas e minutos
GOSTEI 0
Celamar
28/09/2005
Valores reais:
- Total previsto = 28:00h
- Total realizado = 16:26
Para:
lbSaldo.Caption := Format(´¬d:¬02d:¬02d´, [Trunc(tPrevistoAux)*24 + H, M, S]);
Resultado = 672:0:0
Para: dias, horas, minutos
Resutlado = 9 dias, 0 horas 23 minutos
E teria que ser 11:34 devedor
- Total previsto = 28:00h
- Total realizado = 16:26
Para:
lbSaldo.Caption := Format(´¬d:¬02d:¬02d´, [Trunc(tPrevistoAux)*24 + H, M, S]);
Resultado = 672:0:0
Para: dias, horas, minutos
Resutlado = 9 dias, 0 horas 23 minutos
E teria que ser 11:34 devedor
GOSTEI 0
Martins
28/09/2005
O TTime (assim como o TDate e o TDateTime) é um número que representa um total de dias; a parte inteira é o número de dias e a parte fracionária é a fração de dia. Por exemplo, 36 horas equivale a um TTime igual a 1.5, ou seja, um dia (24 horas) mais 12 horas.
Para exibir o valor da forma que você quer, use uma função para formatar parecida com esta......é meio complicado, mas o Delphi só possui (acho) funções que consideram a hora no intervalo entre 0 e 23.
function Exemplo(T: TTime): string; var H, M, S, MS: Word begin DecodeTime(T, H, M, S, MS); Result := Format(´¬d:¬02d:¬02d´, [Int(T)*24 + H, M, S]); end;
E se vc mudar o [b:40c874e330]Int[/b:40c874e330] para [b:40c874e330]Trunc[/b:40c874e330], funcionária como vc quer?
GOSTEI 0
Massuda
28/09/2005
tPrevistoAux está com o valor 28, o que o código está interpretando como 28 dias e não 28 horas. Poste o código que está calculando o tPrevistoAux.
GOSTEI 0
Martins
28/09/2005
Desculpe... o correto seria...
lbSaldo.Caption := Format(´¬d:¬02d:¬02d´, [Trunc(tPrevistoAux)*24 + H, M, S]);
É isso memso [b:3518da8088]Massuda[/b:3518da8088], mandou bem novamente, só pra variar, hehe!!!
t +
GOSTEI 0
Massuda
28/09/2005
Aparentemente, o mesmo erro que citei no meu post anterior está ocorrendo no valor do tempo realizado.
GOSTEI 0
Luineumann
28/09/2005
Valores reais:
- Total previsto = 28:00h
- Total realizado = 16:26
na idéia de armazenar num campo inteiro vc guardaria
total_previsto = 1680 // 28*60
total_realizado = 986 // (16*60)+26
saldo = 1680 - 986 = 694
ao desmembrar os 694 vc terá as 11h e 34 min
armazena no bd os campos do tipo inteiro e para exibir o resultado use campos string calculados
- Total previsto = 28:00h
- Total realizado = 16:26
na idéia de armazenar num campo inteiro vc guardaria
total_previsto = 1680 // 28*60
total_realizado = 986 // (16*60)+26
saldo = 1680 - 986 = 694
ao desmembrar os 694 vc terá as 11h e 34 min
armazena no bd os campos do tipo inteiro e para exibir o resultado use campos string calculados
GOSTEI 0
Celamar
28/09/2005
Observação:
meu TTime (tPrevistoAux) está em segundos, justamente pq pode passa de 24, veja:
Para:
28h previstas
16:26 realizadas --> que tb pode ser maior que 24h (me auto me ferrei)
total 11:34 devedor
Resultado usando lógica acima: 28:0:0
meu TTime (tPrevistoAux) está em segundos, justamente pq pode passa de 24, veja:
tPrevistoAux := iTotalPrevisto / 24; DecodeTime(tPrevistoAux, H, M, S, MS); lbSaldo.Caption := Format(´¬d:¬02d:¬02d´, [Trunc(tPrevistoAux)*24 + H, M, S]);
Para:
28h previstas
16:26 realizadas --> que tb pode ser maior que 24h (me auto me ferrei)
total 11:34 devedor
Resultado usando lógica acima: 28:0:0
GOSTEI 0
Massuda
28/09/2005
Resultado usando lógica acima: 28:0:0
...o que está correto. Você pegou 28 dividiu por 24 e depois multiplicou de novo por 24. Parece que faltou algum cálculo no código que você postou.O segredo é fazer as contas todas na mesma unidade de tempo, seja essa unidade um dia (como estou sugerindo) ou segundos como o rjun e o luineumann sugeriram.
Seria interessante postar todo seu código aqui.
GOSTEI 0
Luineumann
28/09/2005
armazene em segundos
um minuto tem 60 segundos
uma hora tem 60 minutos, logo 60 * 60 segundos = 3600
um dia tem 24 horas, logo 24 * 3600 segundos = 86400
se vc transformar tudo em segundos vc teria
28 horas são 28*3600 = 100800 segundos
16 horas e 26 minutos são (16 * 3600) + (26*60) = 59160 segundos
ss = 100800 - 59160 = 41640
dd = 0
hh = 0
mm = 0
while ss > 86399 // segundos num dia - 1
do begin
dd := dd + 1
ss := ss - 86400
end
while ss > 3599
do begin
hh := hh + 1
ss := ss - 3600
end
while ss > 59
do begin
mm := mm + 1
ss := ss - 60
end
ao final temos nesta rotina o número de dias em dd, horas em hh, minutos em mm e segundos em ss
qual a seua versão do delphi? as + novas tem tb o decodedatetime
um minuto tem 60 segundos
uma hora tem 60 minutos, logo 60 * 60 segundos = 3600
um dia tem 24 horas, logo 24 * 3600 segundos = 86400
se vc transformar tudo em segundos vc teria
28 horas são 28*3600 = 100800 segundos
16 horas e 26 minutos são (16 * 3600) + (26*60) = 59160 segundos
ss = 100800 - 59160 = 41640
dd = 0
hh = 0
mm = 0
while ss > 86399 // segundos num dia - 1
do begin
dd := dd + 1
ss := ss - 86400
end
while ss > 3599
do begin
hh := hh + 1
ss := ss - 3600
end
while ss > 59
do begin
mm := mm + 1
ss := ss - 60
end
ao final temos nesta rotina o número de dias em dd, horas em hh, minutos em mm e segundos em ss
qual a seua versão do delphi? as + novas tem tb o decodedatetime
GOSTEI 0
Celamar
28/09/2005
Versão 7
GOSTEI 0
Luineumann
28/09/2005
se é o 7 experimente usar o decodedatetime
veja o que ele devolve como ano, mes e dia
veja o que ele devolve como ano, mes e dia
GOSTEI 0