Luiz Fernando Posted November 27, 2007 Report Share Posted November 27, 2007 Pessoal estou quebrando a cabeça para calcular a quantidade de horas de um periodo, a funcao abaixo peguei a um tempo atrás no forum do pctoledo funciona certinho, mais preciso agora saber o total de horas de um determinado numero de dias mais somente das 23:59 as 11:59hs,se alguem ja vez alguma coisa parecida e poder me orientar ficaria agradecido... function intervalo(d1,h1,d2,h2) priv d:=0,h:=0,m:=0,s,si si=iif(d2>d1 .or. (d2=d1 .and. h2>h1),1,0) h1=(val(left(h1,2))*60)+val(right(h1,2)) h2=(val(left(h2,2))*60)+val(right(h2,2)) if si=1 d2=((d2-d1)*14400)+h2 d1=h1 s=d2-d1 else d1=((d1-d2)*1440)+h1 d2=h2 s=d1-d2 endif do while .t. if s>59 if (s/60)>24 d=int(s/60/24) s=s-(d*24*60) else h=int(s/60) s=s-(h*60) if h=24 h=0 d=d+1 endif endif else m=s exit endif enddo s=iif((d+h+m)=0,"",iif(si=0,"-","+")) retu s+alltrim(str(d))+","+strzero(h,2)+":"+strzero(m,2) id=code>id=code>Luiz Fernando msn: empresoft@globo.com skype:empresoft empresoft@globo.com FW 24,CLIPPER5 5.3e,CDX,WS,BLINKER 7.0 Quote Link to comment Share on other sites More sharing options...
Luiz Fernando Posted November 27, 2007 Author Report Share Posted November 27, 2007 Pessoal estou quebrando a cabeça para calcular a quantidade de horas de um periodo, a funcao abaixo peguei a um tempo atrás no forum do pctoledo funciona certinho, mais preciso agora saber o total de horas de um determinado numero de dias mais somente das 23:59 as 11:59hs,se alguem ja vez alguma coisa parecida e poder me orientar ficaria agradecido... function intervalo(d1,h1,d2,h2) priv d:=0,h:=0,m:=0,s,si si=iif(d2>d1 .or. (d2=d1 .and. h2>h1),1,0) h1=(val(left(h1,2))*60)+val(right(h1,2)) h2=(val(left(h2,2))*60)+val(right(h2,2)) if si=1 d2=((d2-d1)*14400)+h2 d1=h1 s=d2-d1 else d1=((d1-d2)*1440)+h1 d2=h2 s=d1-d2 endif do while .t. if s>59 if (s/60)>24 d=int(s/60/24) s=s-(d*24*60) else h=int(s/60) s=s-(h*60) if h=24 h=0 d=d+1 endif endif else m=s exit endif enddo s=iif((d+h+m)=0,"",iif(si=0,"-","+")) retu s+alltrim(str(d))+","+strzero(h,2)+":"+strzero(m,2) id=code>id=code>Luiz Fernando msn: empresoft@globo.com skype:empresoft empresoft@globo.com FW 24,CLIPPER5 5.3e,CDX,WS,BLINKER 7.0 Quote Link to comment Share on other sites More sharing options...
viol Posted November 27, 2007 Report Share Posted November 27, 2007 ENTRADA_MANHA="07:00:00" SAIDA_MANHA="11:00:00" ENTRADA_TARDE="13:00:00" SAIDA_TARDE="18:00:00" hora1 = segundos (ENTRADA_MANHA) hora2 = segundos (SAIDA_MANHA) d_hora1 = hora2 - hora1 hora3 = segundos (ENTRADA_TARDE) hora4 = segundos (SAIDA_TARDE) d_hora2 = hora4 - hora3 final = d_hora1 + d_hora2 // TOTAL DE 9HORAS //========================== function segundos parameters tempo final=val(left(tempo,2))*3600 + val(substr(tempo,4,2))*60 + val(substr(tempo,7,2)) return (final) Viol xDev Studio v0.65 xHB build 0.99.50 BCC 5.5.1 FW 2.6 Quote Link to comment Share on other sites More sharing options...
Luiz Fernando Posted November 27, 2007 Author Report Share Posted November 27, 2007 E ai Viol blz, colega nao é exatamente isto que estou querendo, o que eu preciso e achar o numero de horas somando varios dias mais de uma determinada faixa de horario. EX: data1=12/11/2007 time1=12:00hs data2=25/11/2007 time2=14:00hs Nesta faixa de data e hora preciso saber o total de horas apennas das 23:59 as 11:59. Obs: Viol vc no msn e aqui no forum fazendo papel de programador velhinho, rapaz vc é muito novo ainda...Abracos Luiz Fernando msn: empresoft@globo.com skype:empresoft empresoft@globo.com FW 24,CLIPPER5 5.3e,CDX,WS,BLINKER 7.0 Quote Link to comment Share on other sites More sharing options...
fluna Posted November 27, 2007 Report Share Posted November 27, 2007 tt_hora:=0 for i = data_ini to data_final tt_hora+=elaptime(hora_ini,hora_fim) Next id=code>id=code>Clipper 5.3; Fw195; Link Editado por - fluna on 27/11/2007 19:23:23 Editado por - fluna on 27/11/2007 19:24:21 Quote Link to comment Share on other sites More sharing options...
Guest johnson Posted November 27, 2007 Report Share Posted November 27, 2007 e rapa cai um for next ai nao? for 1 to ndias funcao do amigo lah em cima somando as horas das horas next iiiiiii Johnson Lôbo Fortaleza-Ce Fwh-2.5 xHarbour 0.99.3 e VeRCEv4 johnson@oi.com.br Quote Link to comment Share on other sites More sharing options...
fluna Posted November 27, 2007 Report Share Posted November 27, 2007 a elaptime() é nativa, näo? se näo for, posto o código equivalente... mas a funçäo do parceiro lá em cima resolve. Clipper 5.3; Fw195; Link Editado por - fluna on 27/11/2007 19:28:18 Quote Link to comment Share on other sites More sharing options...
Luiz Fernando Posted November 27, 2007 Author Report Share Posted November 27, 2007 Pessoal valeu pela intenção mais o que estou precisando saber nao é saber a qtd de hora baeada em duas horas ou duas datas mais apenas uma faixa durante 24 horas, de varios dias...mais vlw pela intenção... Abracos Luiz Fernando msn: empresoft@globo.com skype:empresoft empresoft@globo.com FW 24,CLIPPER5 5.3e,CDX,WS,BLINKER 7.0 Quote Link to comment Share on other sites More sharing options...
ricardomouramarques Posted November 27, 2007 Report Share Posted November 27, 2007 Luis, Paga aà a função INTERVALO(), com exemplo e tudo: *********************************************************** #Include "Fivewin.ch" //------------------------------------------------------------- Function Main() Set Date fren set century on dData1 := CtoD("01/11/2007") dData2 := CtoD("03/11/2007") cHora1 := "21:00:00" cHora2 := "10:32:10" cInter := Intervalo( dData1, dData2, cHora1, cHora2 ) MsgInfo( cInter ) //-------------------------------------------------------------- Function Intervalo( dData1, dData2, cHora1, cHora2 ) local nDias := dData2-dData1 local nHoras, nSec1, nSec2, nSobra, cH, cM, cS nSec1 := Segundos( cHora1 ) nSec2 := Segundos( cHora2 ) if nSec1 > nSec2 nDias-- endif nSobra := Segundos("24:00:00")-nSec1 + nSec2 cH := Alltrim(str( nDias*24+int(nSobra/3600) ) ) cM := StrZero( int( nSobra%3600/60 ), 2 ) cS := StrZero( int( nSobra%3600%60 ), 2 ) Return cH+":"+cM+":"+cS //-------------------------------------------------------------- Function Segundos( cHora ) Return ( Val(Left(cHora, 2))*3600 + Val(SubStr(cHora, 4,2))*60 + Val(Right(cHora,2)) ) ************************************************************ Ricardo Marques VRMM-Visual Fivewin Quote Link to comment Share on other sites More sharing options...
ricardomouramarques Posted November 27, 2007 Report Share Posted November 27, 2007 Luiz, Pequena correção na função INTERVALO(). Pega aÃ: ************************************************************ #Include "Fivewin.ch" //------------------------------------------------------------- Function Main() Set Date fren set century on dData1 := CtoD("01/11/2007") dData2 := CtoD("03/11/2007") cHora1 := "21:00:00" cHora2 := "21:30:00" cInter := Intervalo( dData1, dData2, cHora1, cHora2 ) MsgInfo( cInter ) //-------------------------------------------------------------- Function Intervalo( dData1, dData2, cHora1, cHora2 ) local nDias := dData2-dData1 local nHoras, nSec1, nSec2, nSobra, cH, cM, cS nSec1 := Segundos( cHora1 ) nSec2 := Segundos( cHora2 ) if nSec1 > nSec2 nDias-- nSobra := Segundos("24:00:00")-nSec1 + nSec2 else nSobra := nSec2 - nSec1 endif cH := Alltrim(str( nDias*24+int(nSobra/3600) ) ) cM := StrZero( int( nSobra%3600/60 ), 2 ) cS := StrZero( int( nSobra%3600%60 ), 2 ) Return cH+":"+cM+":"+cS //-------------------------------------------------------------- Function Segundos( cHora ) Return ( Val(Left(cHora, 2))*3600 + Val(SubStr(cHora, 4,2))*60 + Val(Right(cHora,2)) ) ********************************************************** Ricardo Marques VRMM-Visual Fivewin Quote Link to comment Share on other sites More sharing options...
Luiz Fernando Posted November 27, 2007 Author Report Share Posted November 27, 2007 olá ricardo blz, acho que não consegui me expressar direito aqui o que quero, eu trabalho com programa de motel,existe uma tabela de horario, mais a opção pernoite que começa a contar a partir das 23:59 até as 11:59, então um exemplo, o Pedro entrou no motel no dia 25/11 as 14:00hs, e saiu tres dias depois as 16:00hs preciso saber o total de horas mais sem somar o intervalo da pernoite... Abracos Luiz Fernando msn: empresoft@globo.com skype:empresoft empresoft@globo.com FW 24,CLIPPER5 5.3e,CDX,WS,BLINKER 7.0 Quote Link to comment Share on other sites More sharing options...
ricardomouramarques Posted November 27, 2007 Report Share Posted November 27, 2007 Agora intidÃ: Pega aà então: ************************************************************ #Include "Fivewin.ch" //------------------------------------------------------------- Function Main() Set Date fren set century on dData1 := CtoD("01/11/2007") dData2 := CtoD("02/11/2007") cHora1 := "22:59:00" cHora2 := "12:00:00" cIniPer := "23:59:00" cFimPer := "11:59:00" cInter := Intervalo( dData1, dData2, cHora1, cHora2, cIniPer, cFimPer ) MsgInfo( cInter ) //-------------------------------------------------------------- Function Intervalo( dData1, dData2, cHora1, cHora2, cIniPer, cFimPer ) local cH, cM, cS local nTot := 0 do while dData1 <= dData2 if dData1 < dData2 if Segundos( cHora1 ) <= Segundos( cIniPer ).and. Segundos( cHora1 ) >= Segundos( cFimPer ) nTot += Segundos( cIniPer ) - Segundos( cHora1 ) endif cHora1 := cFimPer else if Segundos( cHora1 ) > Segundos( cFimPer ) nTot += Segundos( cHora2 ) - Segundos( cHora1 ) else if Segundos( cHora2 ) > Segundos( cFimPer ) nTot += Segundos( cHora2 ) - Segundos( cFimPer ) endif endif endif dData1++ enddo cH := Alltrim(str( Int(nTot/3600) ) ) cM := StrZero( int( nTot%3600/60 ), 2 ) cS := StrZero( int( nTot%3600%60 ), 2 ) Return cH+":"+cM+":"+cS //-------------------------------------------------------------- Function Segundos( cHora ) Return ( Val(Left(cHora, 2))*3600 + Val(SubStr(cHora, 4,2))*60 + Val(Right(cHora,2)) ) *********************************************************** O "Pedro" entrou uma hora antes do inicio do pernoite e saiu um minuto depois... deu "01:01:00". Testei aqui o exemplo acima e deu blz. Se entrar e sair das 23:59 enm diante e sair até à s 11:59 dá zero. Se sair dois dias depois à s 11:59 dá 12 horas... se sair dois dias depois à s 13:59 dá 14 horas. Se entrar 1 hora ante do inicio do pernoite e sair no dia seguinte 1 hora depois do fim, dá 2 horas... e bla! bla! bla!. Testa aà e vê se é isso mesmo que você quer.. Ricardo Marques VRMM-Visual Fivewin Quote Link to comment Share on other sites More sharing options...
pedro_66 Posted November 27, 2007 Report Share Posted November 27, 2007 ... Luis que Motel é esse que entrei a essa hora ??? Um abraço... PEDRO PEDRO AIRTON Quote Link to comment Share on other sites More sharing options...
LUIS1361303120 Posted November 28, 2007 Report Share Posted November 28, 2007 Empresoft, vou mandar para o seu email um programa que calcula horas, de uma olhada nos fontes,,, luis Quote Link to comment Share on other sites More sharing options...
Luiz Fernando Posted November 28, 2007 Author Report Share Posted November 28, 2007 citação:Agora intidÃ: Pega aà então: ************************************************************ #Include "Fivewin.ch" //------------------------------------------------------------- Function Main() Set Date fren set century on dData1 := CtoD("01/11/2007") dData2 := CtoD("02/11/2007") cHora1 := "22:59:00" cHora2 := "12:00:00" cIniPer := "23:59:00" cFimPer := "11:59:00" cInter := Intervalo( dData1, dData2, cHora1, cHora2, cIniPer, cFimPer ) MsgInfo( cInter ) //-------------------------------------------------------------- Function Intervalo( dData1, dData2, cHora1, cHora2, cIniPer, cFimPer ) local cH, cM, cS local nTot := 0 do while dData1 <= dData2 if dData1 < dData2 if Segundos( cHora1 ) <= Segundos( cIniPer ).and. Segundos( cHora1 ) >= Segundos( cFimPer ) nTot += Segundos( cIniPer ) - Segundos( cHora1 ) endif cHora1 := cFimPer else if Segundos( cHora1 ) > Segundos( cFimPer ) nTot += Segundos( cHora2 ) - Segundos( cHora1 ) else if Segundos( cHora2 ) > Segundos( cFimPer ) nTot += Segundos( cHora2 ) - Segundos( cFimPer ) endif endif endif dData1++ enddo cH := Alltrim(str( Int(nTot/3600) ) ) cM := StrZero( int( nTot%3600/60 ), 2 ) cS := StrZero( int( nTot%3600%60 ), 2 ) Return cH+":"+cM+":"+cS //-------------------------------------------------------------- Function Segundos( cHora ) Return ( Val(Left(cHora, 2))*3600 + Val(SubStr(cHora, 4,2))*60 + Val(Right(cHora,2)) ) *********************************************************** O "Pedro" entrou uma hora antes do inicio do pernoite e saiu um minuto depois... deu "01:01:00". Testei aqui o exemplo acima e deu blz. Se entrar e sair das 23:59 enm diante e sair até à s 11:59 dá zero. Se sair dois dias depois à s 11:59 dá 12 horas... se sair dois dias depois à s 13:59 dá 14 horas. Se entrar 1 hora ante do inicio do pernoite e sair no dia seguinte 1 hora depois do fim, dá 2 horas... e bla! bla! bla!. Testa aà e vê se é isso mesmo que você quer.. Ricardo Marques VRMM-Visual Fivewin id=quote>id=quote>Ricardo fantástico esta sua função, deu certinho aqui, muito obrigado mesmo... Obs: Vc tem que conversar com o Jose Carlos para que no ano que vem apresentar sua VRMM UNION no congresso. Abracos Luiz Fernando msn: empresoft@globo.com skype:empresoft empresoft@globo.com FW 24,CLIPPER5 5.3e,CDX,WS,BLINKER 7.0 Quote Link to comment Share on other sites More sharing options...
LUIS1361303120 Posted November 28, 2007 Report Share Posted November 28, 2007 entao se deu certo, vou descartar o envio pois e feito no D:::::::::::, fixi nossa,, se postar aqui esse nome sou morto luis antonio ssp/MG Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.